上篇中有提到NetworkDispatcher是通过mNetwork(Network类型)来进行网络访问的,现在来看一下关于Network是如何进行网络访问的。

Network部分的类图:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAywAAAGbCAIAAACpvIMuAAAgAElEQVR4nO3d25GqShgG0I7HEAjBQCjDmCoTIALDoGq/nTwMxvOgIpcGES80sFb9tWumNypCa3/TIIYLAAA/F+ZeAQCALRLCAABm0A5h//33X3Q57dq1a9euXbt27R9sNxMGADADIQwAYAZCGADADIQwAIAZCGEAADMQwgAAZiCEAQDMYOg6YX8hKKVSqIHXqXbt2rVrX2j70EzYXwiXyz+l1LzVDWEArIAQplTqJYQBrJIQplTqJYQBrJIQplTqJYQBrJIQplTqJYQBrJIQto0q9yGEEEJezr0m6vUSwgBWSQhLu86HLDucX/2vdh3zsCvOcz8XNbWEMIBVenKdsNmHnw3UMY9nqb72e40PYedDFvbl9DU8FVn05n3t6sPlOmHatWvXvsp2M2Ez1qnIQojEo1r7NWmdD1l2KPJQO6R4XSaEELLidDkf7r/tivPtVkV+vZPj/XYhZIey2IX6kpd/l9oCefmvfVeX2jKRzNfXrj5ZZsIAVkkIm6fKvJVyetqrEFadzlXub6HnMRN2zKsk113+0jNnVu5DfryGudqJYp27qt/kms/yY/vp9LWrD5UQBrBKQtjv65jHT5CPtddmws71ltYPoW5ftvJT6+a1ibFzd8nWXXXXv9y/1q7eLiEMYJWEsHnq5Zmw4RDWnbKKhrDzIavuvHvP0btq3a2ZsDlKCANYJSFsxnrtnLBICLvdtjOFNhDC7u3nYheywzlyOLJ3ls45YXOVEAawSkLY7DX46ciBEHabNmudmN9zkLF5kxBClu+7RzObJ+ZX6cqnI2cuIQxglYQwpVIvIQxglVwnTKnUy3XCtGvXrn2V7WbClEq9zIQBrJIQplTqJYQBrJIQpjp1PTffZx6TKSEMYJWEsHTrfPuKoX15uV4KNWTFqWfh61cPfeizikJYYiWEAaySEJZu3UNYyEshbNMlhAGskhCWbl1DWJ7vQ35shLBy//hioexwrl39K4QQwi6rrvX6uNWpyG4Lnx/f4X2/wyp1Xb96qBbCbvcskM1aQhjAKglh6dYthJXHPOzLKk6dD1kzjWXFqTUTdi521+8+uuWt/Pi41TXA5cfLPWA9LtCa7bLrnTQyme8jmr+EMIBVcp2wdOsewv6VecjzW96qz2Pdr3N/bB+OLPchhLw8FVnI830Vp653FaovJqoy1u0q+feb1zOZObAEynXCtGvXrn2V7WbC0q0qhFXHH6sQ1jk5rHVO2DEPISsOedgV52Mednm+u/7vUAirfzPS47DmwIlo6kdlJgxglYSwdOsRwm4Zq3Y8sX0OfvvE/Nq5XNevA79nrKHDkc0Qdv0OyhCuRzZn3xpbLiEMYJWEsHSrFsJq39V9aX7H9r2xdphyX15qZ4O1bjt8Yv71oWu/Ni6ToWYqIQxglYQwpVIvIQxglYQwpVIvIQxglYQwpVIvIQxglYQwpVIvIQxglVwnTKnUy3XCtGvXrn2V7WbClEq9zIQBrJIQplTqJYQBrNKTEKaUSqF+9o4AwM+YCVMq9RLCAFZJCFMq9RLCAFZJCFMq9RLCAFZJCFMq9RLCAFbJdcKUSr26ISyp69xo165du/Zp7TPNhJX7EEIIIS/nH+FerFORhZAf516NJVe5D2FXnOdejcu/y/mQZYfz7KvxrMyEAazSLCHsmL8zBp8PWah8fyxvjtPnYve7BDYcEWbdDp06FbW1ucqKU++9lfvw7Kk9bj7w0G+mqNbNf7xJR5cQBrBKk0LY+yNf2JcfGTjfvKuXx+n34uNbD53UdmjVMa+vSWOxU5FFV+xUZP3zoOdDlu3z7L6pfxnCfrlJR5cQBrBKb4ew23gZGocXHzMKu+J8W77IQwj78nLMH1Mlh/NjyX15aS5Zu+e8vE205GU3Fd1HytaD3v63+VjdrNC51bnYPW5Sm+DJitNj/qbxjH7y0OdD1sp/M26HZpYK9bASSUXH/HYnjV50Lna3u+p7auX+NunYu5K1tcr3tWWu63PPf0/62OF8uR8hLcdu0sbGefISaD3oY5nmFo7uOCEMYM0+EcKqMaPc32NWbfS6J63HtMfj5se8PiDlx0t9yeqeq1OIrhmo/uiPo1qdB63PtVSr0Q4f0VW9tZT5Y/g8R3JD9Yx+8dBPQthvt8Pl1h6JC71TU9eEUT+SW89YPU+tzOuxu/vUWn1pX17+nYtdnu/z8t99fu5ZH6s/2ZGbtLVx4i+B/getunFjC8eenRAGsGovhbDahEo1sVLNQNwW2BXloXl2UG2+oXcEvU9g9E3S1H+on7jTuHnzQaNjZ+vO47fqndpphLDfPnQ8Cs+0HerpeSigd+uWUZ4t2d3j8ZVs3EmZ74rzPRVdc8/13+E+Vn+aL2zS0PNE7i+B5x27cyfdZyeEAazaRw5H9o9A0eH2/RDWPvDUdxRsRPiI54DaADkmhH3/oZ8kld9uh8st9ITPzIQNdrBzscuL/pVsLVleZ79ORbYvy3374HVPHyurD1uM3aTNjTMxhA3cSbuEMIBVmnSdsL4R5XYEpzNN0hfCokdtxoewS31mpTs3EzsMdx9Zz8Wub1Xz2zlPpyK7n9BWjcfNc8L6p4W+8ND1Y17RLf/L7dC882+dE9a+eWz6rbmJ8ux2n+din+f74jy2j5X5/cS7MZu0tXHKoZdA74O2t3D/5KLrhGnXrl37Sts/ck5Y5xhK67BObwirLxk7C+ppCLud3VylhOaxpE5LdSp08zzu+jKPQ67VGehlXv16/3Rk9xl9+6GfJJUfb4dWl3jv05HPnloj+7aeWnTvXJqXwBjTxy7HvH1sfWCTNjfOk5dA34N2tnD0YGhPCANgBd6+TtjwIbNE6nMr+fJ1wpLaPumszPB1wpZV39+qQhjAKglhr9aLV8xPavsksjLpXDF/IVtVCANYpZm+tkgpNbqEMIBVEsKUSr2EMIBVEsKUSr2EMIBVEsKUSr2EMIBVmnSdMKXUD6sbwpK6zo127dq1a5/W/mQmTCmVQg28TgFYKG/um2AUB4DUGJs3QQgDgNQYm9fvmsDkMABIioF5/YQwAEiQgXn9qvglhwFAOozKK1cPXkIYAKTD9YdW3t4KXn05bPb11K5du3bt2rfWbmpk5UaGMADgxwzJaxaNXHIYAKTAeLxmQhgAJMt4vFoDYUsOA4DZGYxXSwgDgJQZjFdrOGnJYQAwLyPxOj3NWEIYAMzLdcLW2T4mY9WXSW39tWvXrl279tW3mw5Zp1dDGADwY4bhFRqfruQwAJiLMXiFhDAASJ8xeIVeilZyGADMwgC8Nn2h6i+EvvrxGgIAFyFsfSQtAFgEYzMAwAxcJ2wr7dfJsHTWR7t27dq1a994u5mwrXBEEgCSYmDeCiEMAJJiYAYAmIEQBgAwAyEMAGAGQthWOCcMAJJiYN4KIQwAkuI6YVtpd50w7dq1a9euPal2syMAADMQwgAAZiCEAQDMQAjbEOfmA0A6jMobIoQBQDqMyhsihAFAOozKAAAzcJ0w7dq1a9euXbt21wkDANgGIWxDnBMGAOkwKm+IEAYA6TAqb4gQBgDpMCoDAMxACAMAmIEQBgAwA9cJ21D7XwhJrY927dq1a9e+5XYzYRvixHwASIdReUOEMABIh1EZAGAGQhgAwAyEMACAGQhhG+KcMABIh1F5Q4QwAEiH64RtqN11wrRr165du/Z02k2NAADMQAgDAJiBEAYAMAMhbFucm78+fyEopZRKtgbewA3J2zLcG1iivxAul39KKaUSLCGMByFsfYQwpZRKtoQwWDMhTCmlkq3XQlhS18/Q/vH2Pqmtp/bx7UKYUkolW1UIc50wWCEhTCmlki2HI3lwTtj6CGFqnVXuQwghhLyce02UeqOEMB6EsPURwlRadT5k2eH86n+165iHXXGe+7ko9XYJYZ80++VG1J8c2fQnhKlf1zGPZ6m+9nuND2HnQxb25fQ1PBVZ9OZ97Up9q4bHLOPZawx4s5cQ1qJPqh/WqchCiMSjWvs1aZ0PWXYo8nCVl9UyIYSQFafL+XD/bVecb7cq8uudHO+3CyE7lMUu1Je8/LvUFsjLf+27utSWiWS+vnalvlJC2CcZ8GYvIaxFn1S/qTJvpZye9iqEVadzlftb6HnMhB3zKsl1l7/0zJmV+5Afr2GudqJY567qN7nms/zYfjp97Up9uoSwTzLgzV5CWIs+qb5fxzx+gnysvTYTdq63tH4IdfuylZ9aN69NjJ27S7buqrv+5f61dqU+V6+FsBSue5RyuwFv9op26NT6ieuEqfXVyzNhwyGsO2UVDWHnQ1bdefeeo3fVulszYWrW+nOdsA8y4M1eZsJa9En1w3rtnLBICLvdtjOFNhDC7u3nYheywzlyOLJ3ls45YWr2cjjykwx4T+r69+U33+CEsBZ9Uv28Bj8dORDCbtNmrRPzew4yNm8SQsjyffdoZvPE/OrNx6cjVSolhH3S5we8+wUJm+8go+pc7G5vZz3/dfvDtNz3LXa5/Lt/zuhDb0xC2M8JYUoplWwJYZ/0rRCWHy/3P/g+cnnoewgLeSmErZwQppRSyZYQ9knfDGHXkyrul8ypz47d81OZNxtrAa4xo3a/sk6e70N+bISw5mLn5n2GsMuqEzsetzoV2W3h8+OCPfc7rFLX9XNGtRB2u+dPBzIhrEUIU0qpZEsI+6SvH45sf1rnkcwiBx+rEHb9oToZIr+HsPKYh31ZxanzIWumsaw4tWbCzsWu/nAhPz5uFZ20u6WuXXa9k0Ym+8qHj4SwFiFMKaWSLSHsk756OLL+c33OqZGK6rNQ9+W7xzHPtxD2r8xDnt/yVvM+q8zXPBxZ7kMIeXkqspDn+ypOXe8q1K++WItooX6xxCqTfeegpBDWIoQp1a7vnxeh1Mh6LYSlcN2jlNu/G8LubxxlbdKrcQ2e+rRZNQE2GMKqm1QhrHNyWOucsGMeQlYc8rArzsc87PJ8d/3foRDWvqzi9bDmwIloH+7QqfUT1wlTW6nmnHftXSLyxvL83NPmkYHuVP3YEsJUMvXnOmEf9NUQVoWkx6e46yeKVTepLjP4/HDkv+pL1h7HE9tvZ+33uNq5XPfverve89DhyGYIu38JSfTSjp/q0FwJYWrO+mAIi5/DIISpZddrM2EM+1YIe/zpV32x2tV1Sql9OLKbiuIn5pf/LvUL81zip/zX7nlfXmpng7VuO3xi/vXp1H5tXCbjVx16g4QwNWf1hLDmJ372efPXsvVdQ7V3jNb0eTl4w8fCrY8cff8TQkqNrOExy3j2GgPe7CWEteiTas5q/RkZQhgzE9b5a602Vd8KWH0zYbWjBJ1DAefvf0JIqZElhH2SAW/2EsJa9Ek1Z007HFmfQW/cw7Ex89X95FDsQ0uRKyx+/xNCSo0sIeyTDHizlxDWok+qOevDIexejwW619Bpf2ipN4R98xNCSo0sIeyTDHizlxDWok+qOevtEBb/ppDH3TZuGP/Q0sDhyK99QkipkSWEfZIBb/YSwlr0STVn9Yawnk/8XH9tnZhf+xhQJfZ5oH0Z+9DSYzVut2ycmP+lTwgpNbJeC2EpXPco5XYD3uwV7dCp9RPXCVNqqFxCQm2m/lwn7IMMeLPXNmfCBp61PqmWV0KY2kw5HPlJfyGo2WvuXjCPvuf+J4QppVSqNTxmbXQ8m8yAN3ttNoRddZOoPqmUUsmWEPZJBrzZa+MhrFJFMX1SKaWSLSHskwx4s1c6IWz2w7K1WbH594tSSqluCWGfZMCbvWZPPImcmmYmTCml0i8h7JMMeLPX7OlnXtFzwpRSSiVbA2/prhO2meuEnQ9Z4h8IH7eG0Q6dWj/50vXAqufuOmFKKbWIir5vVzY9qTBB34B3LvbXb89of/lGvVoho/q13j4cRGqXmb5dTnp8tBqzZPpruMmZsOG/pYQwpZRKtl6bCWNYz4B3KvLrl6ANfjPGuxHnmD++Ae2YX78nJK0Q9v013GQIGyaEKaVUsiWEfVJ3wGt931kIIS8OWbbPsxBCyMvrt8yGvOyLOLcFQghZcXz8nO+rOwmPL8Rthbz6bU+1b1irJaHGWh3Ol+uXrO2K83XWqvm9tqmt4esdeoOEMKWUSraEsE+KD3jXo5DnQ14dgLtmiCpMlPvHd8rWDcwz1RNSub9+++wt8N2/K/dy6Zk9KvchP14D0OPw6HXJ8yGrclI0hCW1hq936A0SwpRSKtkSwj4pOuC1TwjrHsWr4sX4g32NheuH+a6J5x50Wreth6fuw4UQBvPNa4cjZ1lDIazjiyHsuh9DGDrTMdE6FVnzjwH17er+ufWNDwN98D7T/6zSymrwEMeKSwj7pPaAdx+lHvLj10PYrWVfXnrmpfofrix2QyNT+msohHV8LYR19+kr1ZhV/f47b7MvnZ/1ou89dFLbIVrVWQG3j85876FbL/P4W8ekR+l7p/r0thp7P83p/zL/xHeTj/yQ0/vP4mcPdLkfFBq5R149KfnHr7XRJYR9UmzAu56Bfjs3P951noawxiHCZna51I5mVq/z7m1ry5+LXbify9U+2Hf5V+a1V9qoc8LmW8PXO/QG9YawN980nx0Xfn7zxgzoG3f16sO9GR/feuiktkOrjnnjv6ozOE9F9om1ejoT9pFRPM0Qlu3zrP4X5u6Ne77upvc+5PTSw33lgfo6VfM9f3iPTAhhv3ytja7XQlgK10NKuT0y4LVOCIt2nWdvHNdTqa7J4/Zzvq+F+uq9MhLzq9tWHxHI8n0tAN1n6KrT3i/H/PpY40PYXGs4ukOn1k9+fP2w5+9o50PnUxT1jX//oEZ2KPLr3nx8YKJ5OuMjT9+WrN1z/8dQap/YaD3ofXc3Hit+AmLjVo8PedzT/O234vT4a7vxjH7y0E9eU7/dDo/OcG1vjUn1j9Ec8zBq8iby2Zr69EPnRV17IqfmZ3paS7b61b0XdR/x+R+0Pdtn1Ap3XwitLdz7t2tZ7Kq3x+qtLLbynZdhfDcNfsgp3zdfgLcN0tp0kWcaqe89ULxTne8bavQANPqTYaNfa419+uS9cUTP7Ol73THLdcI+4O9nJ0F/5Y+eNazhn5mwpt4+2f67sPUpiuab1D1pdScmr2+mj/ed6wH3xrtVz8dQWhOlt7tqPmj9L+Pu+Hr7Obqqt5bbdWGa86y1d/nqGf3ioZ+MK7/dDpdbe2RUuLW3jtie24fVhur22ZpH36itZM8Taf8w2K+6x62uj1jrqw3R7TN2hftfCNEtHN/Fx7yZVOIr3/kwU99uGvqQU2sNW+t823TdZxrfld99oG6nuu2Ini0Z2a09M2HdjTnytdbap/H3xmc9s90xhvre8JhlPHuNEDb7GgphLZ0+WZtQqd7KqrmH2wK7omy93zXfwi7dIfPe2Fqyb4iN/nHcfpPtyYKtO4/fKjSmdvpC2G8fOv4ymWk7NAJHp4f0HvFvhoMnTye6kn0t3R4ysl91HzHaVyPbZ9wKt27V2YYjP890TTONKZmBR38cB+zbTdXu6HzI6aXN/rSL/uCB6p1qYGVGvgV1G7vvaU9ea6Fnfe7387xndu6k2/fu9SeEfdCfywHMXcMdeoN6+2Tvm2PnjSayzCdC2GMcGnj/HRc+4u/atffBMSHs+w89tBd+vh2uFZsJ6x6Bqnbu4ExYfc5g/JD8Tgjre8S+EBaZhnllhYf2Tn8U6+7i4ZV/3GfrnI2+ExljH3J6utnrU4ljQtiXHqjbqaqZsIEt2d2wI0PYqNdac59ODGEDd9IuIeyThLDZSwhreTmEdQ8idJdp/BqbnB8fwi71v4O7f/THDsPd30DvH+CIrOr9FMxTkVVXHr6/7TbPCeufFvrCQ9fH3eiW/+V2aN754HRO9PSdU5E1J8yaSfe+SrXzbKItfRllTL/qPuJACBvs0oMr3P9CiG/hwTOZnq58q5dGd9N57Iec+qejaiHv8b+xffqVB+rrVBPOCeu+xPo/GTbmtdbap2V3p4zqmc2OMTSdKYR9khA2ewlhLWNDWHeq/HzoP1bSd/Oet+buD817Oxe72vc0NA8ZdFoe11CIfYCjepe8/XYfUWqfHbmPCt1n9O2Hfjau/HY7tLpE9enI1qdH+z7IFvmQaeSzNffL9PS21LbA4zM97afT26/ajzgUwiLbcNQKD70QOlt4fAiLrnz1QL2Z+LqbBj/kVD+7oDcbNa+gFN/1/558mmr6A434dOT4EDbyk2FjX2vNffrkvbGvZ0Y7RmsjjBqzjGev+RPC5q7hDr1Bo/rk4Gx5KvW5lXz5OmFJbZ9EVmbgsJGaVnPt2WpXfnufPr3/4euEzbIxv79ThLBPEsJmLyGsRQiL1YtXzE9q+6SxMudit8BvSki7frtna99r/Diu/Y192n2geH32ivlrDWEpXPco5fa/ENTslU5/SKH9zx8GSimVav25TtgHGfBmr2gI2zJ9Uimlkq3hMct49hoD3uwlhLXok0oplWwJYZ9kwJu9hLAWfVIppZItIeyTDHizlxDWok8qpVSyJYR9kgFv9hLCWmb/nIRSSqmBGngDN5695k8Im7uGOzTwVU8HlZ+txtyrAB+gH79GCJu9vPnC79X/pk/hNZhIFoQ3uU7Yy9cJmz2FbLyi77yp9RPt2tfR3j2eUv95xvWMxsF0tpt27SPb/SXxGiFs9vLnL3zbwLksibwAq9VIZH1gGt33NbOf36f+vOfC1wy/xNJ59f31TM7Bsui7AFs38i+cdOJOa03SWTF4iY4LsFEvzS4nFXS6K5PU6sFIei3A5kw4sp9UyomuTFJrCGPosgBb9FJkSS3f9K1PausJw/RXgI0aH1lSCzeL+PQAPOU6Ydq1a9e+3fYxkaVvmdmvE9an9b8pbGft2l0nDIC2BX0osrLEdYYu3RRg6xZ3dO+dCTxIhz4KsHWrDGHjF4O56KAALOyiD8v9SAHU6Z0A2zX8/T/JJpiXQliyzwJ0TYCNGk5dKWeXkeeEpfwU4CKEAWzT0+udppxghk9iE79YinY3Ter6Gdq1a9eu/fftrRAz+/p02/vOYIu2J7j+2rVf+VsBgLbEZ5Jah01NfbFQei0AC3ONXLIXS6f7AmzFaiKL+MU66MQAm7CR1LKRp8k66KwA67edaLKdZ8oK6KwArIocxlLoqQAAM3CdMO3atWtfZ3vfhFBq66ld+2bbzYQBrJBDcpA+r1KAtZHAbAEWQTcFYIXkMNKnjwKwQkIY6dNHAQBmIIQBrIGJH1gcL1qAZfNFirBQrhOmXbt27dpX2/4XQlLro117nT+eAFgtc4SkTO8EYM3kMJKlawIsj2ABK+BlDLAwEhisg1cywJJIYLAaXswArJzkSpr0SwDWTw4jQa4Tpl27du2pt18DRDrrs8T2bghLcz21b6rdXwYASTOFA2vltQ2QLgkMVszLGwBgBkIYAFthZpGk6I4AbIUQRlJ0R4C0CApfZfOSDn0RICEiAmyH66Zo165deyrtrgemXfum2v3JBQAwAyEMgG1xzJdE6IgAcxIIZmGzkwK9EGA2osBcbHlSoBcCzEMOgI3zFgAAMAMhDABgBq4Tpl27du3aN9oePSKc4HpqX2u7mTCA33EeWFLsDual/wH8iCE/QXYKM9L5AH7BYA+0eFMAAJiBEAYAMAMhDOBbHIJcBLuJueh5AF9haF8QO4tZuE6Ydu3ap7T/haC+V7Pv362117d5CuujfSPtsj8wxV8Il8s/9Y0yKwMb4aUOTCGECWHAm7zUgSmEMCEMeJOXOjCFECaErY8tz4/pcMAUQpgQtj62PD+mwwFTJBTCyn0IIeTH+dekXudDFkLIDmchbFFsfH5JbwOmeCGENUNSmYcQQl7+u1yOeQgh7Mvbkq1f++q62F1+rO7/XOxCCFlxeiXxdB70em93WXEavWJCGPAa1wnTrl37lPaZQth1mV1x7r3/F6v5oPG7SiWEpbDftWvX/sF2f28BU7wfwsrGjNY+b/5aXkPMY0rqcL78i891Vfdff6D6hNY1CV1bsl1Wa2ytQxG7/3JwxR4Ltx6xFsJu9zA6kJkJg43wUgemeDmENT2fCauFmCp71WbRBkPY+ZBV8ajc36LSLYQ9UlFkHSLHIgdmwk5FFm7TcrU7v1xORV4LYa9P1Alh87L9+RldDZji5RD26uHI+uG8+z2MDGHX0NYMfY15sv51+Bc556yzTPP+d8X5X2TFbuu/m3BQUgiYnV3Ab+hnwBSzhLCRhyOfLPYkhLVS1OHcXKZ+52X+LISFXZaFyMoIYW/4m/ubPeetuTc/n2R3AlP8MoR1btJzYn7rh1a0ejWEPZZvLHO9bVacxh6OvKexxjoLYW94oe+trvSNlbE7gSk+EcLqx/X2ZevX1on5j3Oqei9R0Xig7unz8RDWeNDmhwMe01fN9axW4DrLdU9X/Sfm328+9vOVBtphQhirYXcCU3x9IHzjEg9LLwPtMCGM1XCdMO3atU9pF8J+P9CmsN9TaBfC0twv2ie0y9TAFFseCH850NK15b6nb6yM3QlMseWB0EA7r9/1vW98Lel7U7z6xsrYncAUQtj3ykA77LW+1/+5kNdum8CXiuob62N3AlMIYd8rA+2wGUJYGl8qqm+sj90JTCGEfa8MtMM+E8KilyxpfNnUvhy8/O/vv1RU31gfuxOY4m/u64avu+bevUn7mxDCmp6FsOu3vD9CWCJfKiqErY/dCUzx2kCoDLSfMyWEvTQT1vpC99tt5/9SUX1jfVwnTLt27VPahbDvVd9Am8J+T6H96yGsykbRyar5vlT04jphq2uXqYEphLDvldmOYZ8MYa0vJx0Twub7UlF9Y33sTmAKIex7ZaAd9pkQdotKtQOM/SGsTONLRfWN9bE7gSmEsO+VgXbYlvuevrEydicwxecHwvMhS/+bIn+ykgbaYUIYq2F3AlP0DYTnYn89Feb59TDrh2ny4y3fvJRyhhdu/W/1a7396cN9eyUNtK8TwlgNuxOYomcgPBX59UznJ6e5nItd/VSYMt+XE57u5GoAAA5oSURBVCaZvhzCfrGSBtrXCWGsht0JTNEdCFsnL4cQ8uKQZfs8u571fDsP+n5OdOdDYa1Jpsf1x3fF+fa/xf0hWidWZ8Xpcj5krQ+axUNY/VbHx8/5vlrVL66kgfYThDBWw3XCtGvXPqU9PhBej0KeD/k1cFTBqNw/PrF/+4BYZ6qskW+OebVA1V5db+l6J5fOnFY3hLVS4cBMWP3m16+s+cZKvjfQprDfU2gXwtLcL9ontMvUwBTRgbB9Qlj3CODAOVX1/2rnp+ZxwOiBxW69dDiysfAxD7ui/MlKPhto6RLCWA27E5iiPRB2v6GvOo09kkiOefcala180wouvw9h55+spIH2dX9zf7PnvDX35ueT7E5githsxDHPj9W5+fEgcv+h95z3R0rrfNlL/Bhi7YDgqHPCurfal62F70cSP7+SQtgnmAljNexOYIrIQNg6IewyFMIurW877l79oX6wrzXtVPv58V0x40NY4xtm7j/n+9qxxZ6vZH5/JQ20nyCEsRp2JzDF2gbClC4Va6Adtra+p29smN0JTLG2gVAIW4619T19Y8PsTmCKLQ+EBtp5bbnv6Rsr4zph2rVrn9K+5YFwroE2hf2eQvuW+96f64Stq12mBqbY8kD4y4GWri33PX1jZexOYIotD4QG2nltue/pGytjdwJTbHkgNNDOa/bLpc5bc29+PsnuBKaYfShad829e5P2t+E/APSNlbE7gSm2PBAaaOe15b6nb6yM3QlMseWB0EA7ry33PX1jZexOYIotD4QG2nltue/pGyvjOmHatWuf0r7lgXCugTaF/Z5C+5b73p/rhK2rXaYGptjyQPjLgZauLfc9fWNl7E5gii0PhJ+oU5GFEEIIu+JsoH3NlvuevrEydicwxY8GwoHv1W79V/VrvX345qESSUJffSLnYhfy4+Xy71LuQ2cNDbTDhDBWw+4EplhDCKsvFvbl757IMX/EvlORhbw00L5ACGM17E5gitED4TG/TzflxSHLDkUewjXxPOaibonkXOyaU1PVMbuQFaf28vEQVr/J8fFzvs+yfX7/NS+7qegewjprVX8KITucoyFv4Lm01+rUmv06F7usOBloxxu+zu3qa+7NzyfZncAUf50Qdosd93hR5iEvm9M850MWql+buac1X1Xub0frHv/VWb5xPDE8Hro3JN1DVbkPYV/WF3ukou5a1Z5C9bjt+4+u262lzO+J836rduqqnqwQthz2ER+hGwFTdELYLYjcz3Y6FdmuKHuOGF5ap2SFztxYJ1F1l3/pcGT3aGDZeaz4WsUCVuv+47e6P6nOc2+HsE4GNcCnzz7iI1wnTLt27VPa2yGsliTKPITqAOJACGvNftUnq7rhKbr8myHsEe/65+RGhrD4mWe1KPaJmbAU9rv2qz/X69LuOmHAXLqHI2PVORzZSELNE9KbMSW0E9LQ8p0jj/UTvNoZ6HbwsdXS9yjRw5H3+7+vZ2Td8lvMOhXZ/Qy2aq2cEwZcLhchDJhmXAhrHOC7nph/jv3XNZSU9xPgs3wfn1erL98/zfa4SfVzvq8dMezEstsJbVVa6hwSbbZUJ90/1rO9zONc/ipg1dbKpyOBy0UIA6YZG8ISqYFrVfz4TqrM5zphsHle6sAUQth75Yr5i2c38T59CJhiYSFsUWV0XwS7iffpQ8AUQpgQtnF2E+/Th4AphDAhDHiT64Rp1659SrsQ9vsQlsJ+165d+wfb/b0FTCGE/T6EASvjpQ5MIYQJYRtnN/E+fQiY4i8E9b2ae/cyij3Fm3QgYEkMe6RDb+RNOhCwGMY8YE28owGLIYQBa+IdDQBgBq4Tpl27du3atU9pv07NprM+2hfXbiYMAKZwfJw36UDAAhjtSJBuyZt0ICB1hjpglby1AakTwoBV8tYGADADIQwAJjJNyzv0HgCYSAjjHa4Tpl279nTbXYdJe+LtfyEktT7al9UuwgOJMscArJv3OCBRQhiwbt7jAABmIIQBwHSmbJlM1wGA6YQwJtN1gLQY0lgWPZbJdB0gLYY0YCNcJ0y7du0JtUcTWILrqV37U6mtp/YE2/3FCQAwAyEMAKZzAJ3JdB0AmE4IYzJdB0iCkYzl0nuZRr8BkmAYA7bGux4wPwkM2CBvfAAAM3CdMO3atWvXrv2tdte30z6t3UwYALzF8XSm0W+AORm9WAHdmGn0G2BORi9gs7z9wfL8haCm1dy7DuDBWxIsz18Il8s/9WrJYUBSvB/B8ghhk0PY/V/4MP2KCXQaWB4h7J0QJofxDToVE7hOmHbty2sXwt4MYa0cltr+XVP77GcBqvcrwX61mnbJHZbnryeEhVp7WEVQiz6j6FMb83xb2607uvBxfX1VLaWiOYxPsWVheaaFsNDvW+/g50OWHc7v3Uk3e0WfWvQ5doeTWAtfJIQtvf6cSflNNissT3Rgu2aOgYzVF9FuP7cCU/Vrvf1pqCr3j0fNj7flX4piPQsPBMfxITK63YwuXyWELb2qPeiV8g22KSzPQAjr+/Xy/RB2LnYh7Mv7r2W+LyfMhPXfZDhNTjgc2WznK4SwpVd9D3qlfJwNCsvTHdiqyaHhmbA+l0tfCDsV2W2ZrDg+fs73WbbP77/m5b/L5VRku+LcfAdvzYSdD/db7Irz7X+LvHUn1cOduuvf+qH+9Iefe3c4iY00fF7fNu/7k0ClVn+RFxEfY2vC8vzFJr3q/w7/EP/5kZDuBmbCzocs3CNXuQ9hX54PWW0a7FJf/narY14tULXfste/S7mPPNyIJ3KpBdDuNukOJ8M1945doWkhLJqnoztafbu6e9Ar5YNsSlie6MD2dDboeQgbfziysfAxD7uijB1GrIewdshrHqyM3/O/vmdUPa/QjJ7RJ/jKYMOHzd9XuxW9eaN/3v/AiN5J68TH7wWg/hfFLyu6B71YPqW9HZO6foZ27dqj7cMDW3foqloG0sy7Iex8/Tc2ivSdnj86hPX90F1moGXcYJPE/l1T+0BfHbn7fhfC6re9ztp27iRy4uOHss7z9ZyponvQ6+VT7cIsLM/wwDZmcui1ga1+GLE7ON2PJPaemP84HHk/+NgdY6IPF3teT59aX8u4wYYP6/bV+izmwEzY638wjD5/8WkIqw6dt2NQ7MTHS/1Q/uNWjZMdI6c/dk6RvD1utcyp+RRaZ1X2PNAPQ5iXzEfYgrA8T2cXohFkYgi7/Cvz68B2evyc72vHbh6Z6VzsHs3dS1TUj/h05x5iD3eJZcrusxvTIoTNotVX63sz9Mfr5321Fc1ePX9xOIT1naEYPfGx9tfFudjdun3rZMfI6Y+dUyQvpyLr+Sul82dM7wN9J4QN19xdbNlsPlie4RAWatMML4Swl+pXB0q6CWxgseGWMYPN3Dt2hQb6aogZ1Vc/e/5i95ywvmOa0W7fPY7ZXY1oS+N5x67n0noKYx7o+y9Jr5rPsvlgeYYHtlbjQI5pjXwv1E/e8Vujb9+A3bek4SQFY/pqNEP3iXS/T4Ww6PH3Rj/vP/Gx+nl8CBs4RTL6FISwNbL5YHmiA5synCRoIIRd+mc6p8+EjTp/sZGlHof26ou9cGJ+7Cjh0xDWPUUyejiysRojHsirZmlsPlgeIcxwshTDIezSP0c79PP75y92Dz427/Nc7MJ1zqxz2/aJj41760S33hDWsw7VHZf/Gk+h/8R8IWzRbD5YHiHMcLIUI2fCWlHsSQh7qdK40MNay6vmTa7zoV378tr/OiPWsPqS0Z/7Gscss5rqDiep7fcltg+EsG5ni7a3OvnLe1YI+2bVXzUp9LfFtcuwsDzdEDbwLjkQwqID20s5bCDwLa78Tf8NZm3XXV41b7L5YHmmhbBXp8QmBCwhjBYhbN3lVfMmmw+WJ3o4sv5r979ac1eXnkNCrXr1cKQQRosQtu7yqnmTzQfLE50Je/rvmCOPA3mu29idJBPCaOmGsGgHmxD3hw0/3PCr4KU12Xh51bzJ5oPliYawvvFmeEDqji7dibS+pDXwwxLLcPIN0ZmwMT0nmvVH9rSBPj/yr5Hhde4LfBssr5o32XywPNNCWGsUaY1MYwaw8T8ssQwn3xANYfWO93T6qu+2Y/731SmxCQFr0X3+/fKqeZPNB8sTDWFP/62PKwMjjRDGBw2EsL6eM6Y7Df/lUO/53ZaRAe5p4wr6/PvlVfOm9uZL6voZ2rVrj7Z3Q9jTAWlg5IiGsO5wFY1crRi36AGpO5yktt+X2B7tq2Pie/SvhWicevqHR1/Pjy4z/HpZWZ//7Ksmhf62uHYZFpanO7ANvEsOTxL0DUvR9qcPt+gByd/03/D3LNMMd8KBnvxq46UZ0QbueSBpjYmPmyqvmjfZfLA8E0JY98/97kgzPLoIYUzQF8L6XEZHpTGNrRms1goM3/PTO1xBn3+/vGreZPPB8owMYdGMNTzq9C0wZvm+x1pKGU6+oS+E9f0w0M365rQG/m1lu6d/ePT9LIT1lVfNm2w+WJ7owKYMJwn6XggbSE6v/uHRNwPXN6NWfwghbO4utmw2HyyPEGY4WYqBEDY8vTpmJqyvoplsOIR1l7mMm+4SwubuYstm88HyCGGGk6Xo9tVo3OnW+yGsO1v29HCkEPZqedW8yeaD5RHCDCdL8dcTay49p+cPLxn939b9Tzgc2feIT5fve6ztlFfNm9qbL6nrZ2jXrj3a/heC+kYlsn/X1P637Yyy+qq/alLob4trl2EB+BYhbN1lJuxNNh8A3yKErbuEsDfZfAB8ixC27hLC3mTzAfAts5/np75dc3exZbP5AABmIIQBAMxACAMAmIHr4mjXrl27du3atbtOGADANghhAAAzEMIAAGYghAEAzEAIAwCYgRAGADADIQwAYAauE6Zdu3bt2rVr1+46YQAA2yCEAQDMQAgDAJiBEAYAMAMhDABgBkIYAMAMhDAAgBn8Dz1A6TXntTTmAAAAAElFTkSuQmCC" alt="" />

Network有一个实现类BasicNetwork,它有一个mHttpStack的属性,实际的网络请求是由这个mHttpStack来进行的,看BasicNetwork的performRequest()方法,

  @Override
public NetworkResponse performRequest(Request<?> request) throws VolleyError {
long requestStart = SystemClock.elapsedRealtime();
while (true) {
HttpResponse httpResponse = null;
byte[] responseContents = null;
Map<String, String> responseHeaders = new HashMap<String, String>();
try {
// Gather headers.
Map<String, String> headers = new HashMap<String, String>();
addCacheHeaders(headers, request.getCacheEntry());
httpResponse = mHttpStack.performRequest(request, headers);
StatusLine statusLine = httpResponse.getStatusLine();
int statusCode = statusLine.getStatusCode(); responseHeaders = convertHeaders(httpResponse.getAllHeaders());
// Handle cache validation.
if (statusCode == HttpStatus.SC_NOT_MODIFIED) {
return new NetworkResponse(HttpStatus.SC_NOT_MODIFIED,
request.getCacheEntry() == null ? null : request.getCacheEntry().data,
responseHeaders, true);
} // Some responses such as 204s do not have content. We must check.
if (httpResponse.getEntity() != null) {
responseContents = entityToBytes(httpResponse.getEntity());
} else {
// Add 0 byte response as a way of honestly representing a
// no-content request.
responseContents = new byte[];
} // if the request is slow, log it.
long requestLifetime = SystemClock.elapsedRealtime() - requestStart;
logSlowRequests(requestLifetime, request, responseContents, statusLine); if (statusCode < || statusCode > ) {
throw new IOException();
}
return new NetworkResponse(statusCode, responseContents, responseHeaders, false);
}
             //一堆catch...
      }

可以看到,在该方法中,实际是调用了mHttpStack.performRequest(request, headers);来进行网络访问,并对访问结果进行处理,貌似用的是Decorator模式。

如果状态码是304(HttpStatus.SC_NOT_MODIFIED)表示从上次访问后,服务器数据没有改变,则从Cache中拿数据。

【304(未修改)自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。如果网页自请求者上次请求后再也没有更改过,您应将服务器配置为返回此响应(称为 If-Modified-Since HTTP 标头)。服务器可以告诉客户端自从上次抓取后网页没有变更,进而节省带宽和开销。】

再来看HttpStack部分, HttpStack有两个实现类:HttpClientStack,HurlStack。分别通过HttpClient与HttpURLConnection来进行网络请求。

来看HttpClientStack的performRequest()方法

 @Override
public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders)
throws IOException, AuthFailureError {
HttpUriRequest httpRequest = createHttpRequest(request, additionalHeaders);
addHeaders(httpRequest, additionalHeaders);
addHeaders(httpRequest, request.getHeaders());
onPrepareRequest(httpRequest);
HttpParams httpParams = httpRequest.getParams();
int timeoutMs = request.getTimeoutMs();
// TODO: Reevaluate this connection timeout based on more wide-scale
// data collection and possibly different for wifi vs. 3G.
HttpConnectionParams.setConnectionTimeout(httpParams, );
HttpConnectionParams.setSoTimeout(httpParams, timeoutMs);
return mClient.execute(httpRequest);
} /**
* Creates the appropriate subclass of HttpUriRequest for passed in request.
*/
@SuppressWarnings("deprecation")
/* protected */ static HttpUriRequest createHttpRequest(Request<?> request,
Map<String, String> additionalHeaders) throws AuthFailureError {
switch (request.getMethod()) {
case Method.DEPRECATED_GET_OR_POST: {
// This is the deprecated way that needs to be handled for backwards compatibility.
// If the request's post body is null, then the assumption is that the request is
// GET. Otherwise, it is assumed that the request is a POST.
byte[] postBody = request.getPostBody();
if (postBody != null) {
HttpPost postRequest = new HttpPost(request.getUrl());
postRequest.addHeader(HEADER_CONTENT_TYPE, request.getPostBodyContentType());
HttpEntity entity;
entity = new ByteArrayEntity(postBody);
postRequest.setEntity(entity);
return postRequest;
} else {
return new HttpGet(request.getUrl());
}
}
case Method.GET:
return new HttpGet(request.getUrl());
case Method.DELETE:
return new HttpDelete(request.getUrl());
case Method.POST: {
HttpPost postRequest = new HttpPost(request.getUrl());
postRequest.addHeader(HEADER_CONTENT_TYPE, request.getBodyContentType());
setEntityIfNonEmptyBody(postRequest, request);
return postRequest;
}
case Method.PUT: {
HttpPut putRequest = new HttpPut(request.getUrl());
putRequest.addHeader(HEADER_CONTENT_TYPE, request.getBodyContentType());
setEntityIfNonEmptyBody(putRequest, request);
return putRequest;
}
case Method.HEAD:
return new HttpHead(request.getUrl());
case Method.OPTIONS:
return new HttpOptions(request.getUrl());
case Method.TRACE:
return new HttpTrace(request.getUrl());
case Method.PATCH: {
HttpPatch patchRequest = new HttpPatch(request.getUrl());
patchRequest.addHeader(HEADER_CONTENT_TYPE, request.getBodyContentType());
setEntityIfNonEmptyBody(patchRequest, request);
return patchRequest;
}
default:
throw new IllegalStateException("Unknown request method.");
}
}

通过request的mMethod属性来生成相应的HttpUriRequest, 然后通过成员属性mClient(HttpClient类型)的execute()方法来执行网络请求。

接着看HurlStack的performRequest()方法

 @Override
public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders)
throws IOException, AuthFailureError {
String url = request.getUrl();
HashMap<String, String> map = new HashMap<String, String>();
map.putAll(request.getHeaders());
map.putAll(additionalHeaders);
if (mUrlRewriter != null) {
String rewritten = mUrlRewriter.rewriteUrl(url);
if (rewritten == null) {
throw new IOException("URL blocked by rewriter: " + url);
}
url = rewritten;
}
URL parsedUrl = new URL(url);
HttpURLConnection connection = openConnection(parsedUrl, request);
for (String headerName : map.keySet()) {
connection.addRequestProperty(headerName, map.get(headerName));
}
setConnectionParametersForRequest(connection, request);
// Initialize HttpResponse with data from the HttpURLConnection.
ProtocolVersion protocolVersion = new ProtocolVersion("HTTP", , );
int responseCode = connection.getResponseCode();
if (responseCode == -) {
// -1 is returned by getResponseCode() if the response code could not be retrieved.
// Signal to the caller that something was wrong with the connection.
throw new IOException("Could not retrieve response code from HttpUrlConnection.");
}
StatusLine responseStatus = new BasicStatusLine(protocolVersion,
connection.getResponseCode(), connection.getResponseMessage());
BasicHttpResponse response = new BasicHttpResponse(responseStatus);
response.setEntity(entityFromConnection(connection));
for (Entry<String, List<String>> header : connection.getHeaderFields().entrySet()) {
if (header.getKey() != null) {
Header h = new BasicHeader(header.getKey(), header.getValue().get());
response.addHeader(h);
}
}
return response;
}

也是根据request的mMethod属性来生成相应的HttpURLConnection,通过HttpURLConnection来进行网络请求。

那么什么时候使用HttpClientStack(即使用HttpClient),什么时候使用HurlStack(即使用HttpURLConnection)呢? 来看一个叫做Volley的工具类

 public class Volley {

     /** Default on-disk cache directory. */
private static final String DEFAULT_CACHE_DIR = "volley"; /**
* Creates a default instance of the worker pool and calls {@link RequestQueue#start()} on it.
*
* @param context A {@link Context} to use for creating the cache dir.
* @param stack An {@link HttpStack} to use for the network, or null for default.
* @return A started {@link RequestQueue} instance.
*/
public static RequestQueue newRequestQueue(Context context, HttpStack stack) {
File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR); String userAgent = "volley/0";
try {
String packageName = context.getPackageName();
PackageInfo info = context.getPackageManager().getPackageInfo(packageName, );
userAgent = packageName + "/" + info.versionCode;
} catch (NameNotFoundException e) {
} if (stack == null) {
25 if (Build.VERSION.SDK_INT >= 9) {
26 stack = new HurlStack();
27 } else {
28 // Prior to Gingerbread, HttpUrlConnection was unreliable.
29 // See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html
30 stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
31 }
} Network network = new BasicNetwork(stack); RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);
queue.start(); return queue;
} /**
* Creates a default instance of the worker pool and calls {@link RequestQueue#start()} on it.
*
* @param context A {@link Context} to use for creating the cache dir.
* @return A started {@link RequestQueue} instance.
*/
public static RequestQueue newRequestQueue(Context context) {
return newRequestQueue(context, null);
}
}

在它的新建一个请求队列的方法newRequestQueue(Context context, HttpStack stack)中,如果没有指定stack,则根据Android SDK的版本来决定使用HttpClientStack还是HurlStack。SDK版本大于等于9(9对应的应该是Android2.3-2.3.2 GingerBread)的时候使用的是HurlStack,小于9的时候使用的是HttpClientStack。

在第一篇的RequestManager中,初始化Volley是如下所示代码,所以得知,如果Android版本是2.3或以后的就使用HurlStack, 低于2.3版本的就使用HttpClientStack来进行网络请求。

 public static void init(Context context) {
mRequestQueue = Volley.newRequestQueue(context);
}

至于为什么要这样做,可以参考http://www.eoeandroid.com/thread-314728-1-1.html或原文http://android-developers.blogspot.com/2011/09/androids-http-clients.html(貌似需要翻墙,把内容贴到下面)

总结如下:

1. HttpClient由于API繁多,所以很难在不破坏兼容性的情况下对它进行优化,所以Android团队对它的优化与改进不是很积极。

2. HttpURLConnection因为API简单,所以对它进行升级优化比较容易。

3. 在Froyo之前,HttpURLConnection有一些bug,尤其是对一个可读的InputStream调用close会污染整个连接池,使得只能通过禁用连接池来解决它。

4. 在Gingerbread中,HttpURLConnection会自动地将这个header  Accept-Encoding: gzip 加入请求并处理相应的经过压缩的响应。在Https连接方面也做了一些改进,HttpURLConnection会尝试通过SNI来进行连接, SNI可以使多个Https主机共享一个IP地址。如果连接失败,也能自动重试。

5. 在Ice Cream Sandwich中,增加了响应缓存。

6. 在Froyo或之前的版本中,最好使用HttpClient,因为它bug很少,而HttpURLConnection却有如3中的bug,Gingerbread或以上的版本,则应该使用HttpURLConnection,HttpURLConnection也是Android团队愿意花精力去优化与改进的。

Android’s HTTP Clients

[This post is by Jesse Wilson from the Dalvik team. —Tim Bray]

Most network-connected Android apps will use HTTP to send and receive data. Android includes two HTTP clients: HttpURLConnection and Apache HTTP Client. Both support HTTPS, streaming uploads and downloads, configurable timeouts, IPv6 and connection pooling.

Apache HTTP Client

DefaultHttpClient and its sibling AndroidHttpClient are extensible HTTP clients suitable for web browsers. They have large and flexible APIs. Their implementation is stable and they have few bugs.

But the large size of this API makes it difficult for us to improve it without breaking compatibility. The Android team is not actively working on Apache HTTP Client.

HttpURLConnection

HttpURLConnection is a general-purpose, lightweight HTTP client suitable for most applications. This class has humble beginnings, but its focused API has made it easy for us to improve steadily.

Prior to Froyo, HttpURLConnection had some frustrating bugs. In particular, calling close() on a readable InputStream couldpoison the connection pool. Work around this by disabling connection pooling:

private void disableConnectionReuseIfNecessary() {
    // HTTP connection reuse which was buggy pre-froyo
    if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {
        System.setProperty("http.keepAlive", "false");
    }
}

In Gingerbread, we added transparent response compression. HttpURLConnection will automatically add this header to outgoing requests, and handle the corresponding response:

Accept-Encoding: gzip

Take advantage of this by configuring your Web server to compress responses for clients that can support it. If response compression is problematic, the class documentation shows how to disable it.

Since HTTP’s Content-Length header returns the compressed size, it is an error to use getContentLength() to size buffers for the uncompressed data. Instead, read bytes from the response until InputStream.read() returns -1.

We also made several improvements to HTTPS in Gingerbread. HttpsURLConnection attempts to connect with Server Name Indication (SNI) which allows multiple HTTPS hosts to share an IP address. It also enables compression and session tickets. Should the connection fail, it is automatically retried without these features. This makes HttpsURLConnection efficient when connecting to up-to-date servers, without breaking compatibility with older ones.

In Ice Cream Sandwich, we are adding a response cache. With the cache installed, HTTP requests will be satisfied in one of three ways:

  • Fully cached responses are served directly from local storage. Because no network connection needs to be made such responses are available immediately.

  • Conditionally cached responses must have their freshness validated by the webserver. The client sends a request like “Give me /foo.png if it changed since yesterday” and the server replies with either the updated content or a304 Not Modified status. If the content is unchanged it will not be downloaded!

  • Uncached responses are served from the web. These responses will get stored in the response cache for later.

Use reflection to enable HTTP response caching on devices that support it. This sample code will turn on the response cache on Ice Cream Sandwich without affecting earlier releases:

private void enableHttpResponseCache() {
    try {
        long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
        File httpCacheDir = new File(getCacheDir(), "http");
        Class.forName("android.net.http.HttpResponseCache")
            .getMethod("install", File.class, long.class)
            .invoke(null, httpCacheDir, httpCacheSize);
    } catch (Exception httpResponseCacheNotAvailable) {
    }
}

You should also configure your Web server to set cache headers on its HTTP responses.

Which client is best?

Apache HTTP client has fewer bugs on Eclair and Froyo. It is the best choice for these releases.

For Gingerbread and better, HttpURLConnection is the best choice. Its simple API and small size makes it great fit for Android. Transparent compression and response caching reduce network use, improve speed and save battery. New applications should use HttpURLConnection; it is where we will be spending our energy going forward.

[Android]Volley源码分析(四)的更多相关文章

  1. Android Volley源码分析

    今天来顺手分析一下谷歌的volley http通信框架.首先从github上 下载volley的源码, 然后新建你自己的工程以后 选择import module 然后选择volley. 最后还需要更改 ...

  2. [Android]Volley源码分析(五)

    前面几篇通过源码分析了Volley是怎样进行请求调度及请求是如何被实际执行的,这篇最后来看下请求结果是如何交付给请求者的(一般是Android的UI主线程). 类图:

  3. [Android]Volley源码分析(三)

    上篇看了关于Request的源码,这篇接着来看下RequestQueue的源码. RequestQueue类图:

  4. [Android]Volley源码分析(二)

    上一篇介绍了Volley的使用,主要接触了Request与RequestQueue这两个类,这篇就来了解一下这两个类的具体实现. Request类图:

  5. Volley源码分析(四)NetWork与ResponseDelivery工作原理

    这篇文章主要分析网络请求和结果交付的过程. NetWork工作原理 之前已经说到通过mNetWork.performRequest()方法来得到NetResponse,看一下该方法具体的执行流程,pe ...

  6. [Android]Volley源码分析(一)

    一. 如何使用Volley? 1. 首先定义一个RequestManager类,用来在Android程序启动时对Volley进行初始化.RequestManager为单例类,因为只有在程序启动时调用, ...

  7. Android Volley源码分析及扩展

    转载请标明出处: http://www.cnblogs.com/why168888/p/6681232.html 本文出自:[Edwin博客园] Volley 介绍 Android系统中主要提供了两种 ...

  8. Volley源码分析(2)----ImageLoader

    一:imageLoader 先来看看如何使用imageloader: public void showImg(View view){ ImageView imageView = (ImageView) ...

  9. Appium Android Bootstrap源码分析之启动运行

    通过前面的两篇文章<Appium Android Bootstrap源码分析之控件AndroidElement>和<Appium Android Bootstrap源码分析之命令解析 ...

随机推荐

  1. 版本管理工具SVN

    此文件根据慕课网 源生活老师的教学视频总结 视频地址 http://www.imooc.com/learn/109 一.SVN下载和安装配置 服务端下载地址 https://www.visualsvn ...

  2. ORA-12523: TNS: 监听程序无法找到适用于客户机连接的例程

    今天使用PL/SQL Developer连接到一台新的测试服务器时,遇到ORA错误:ORA-12523: TNS: 监听程序无法找到适用于客户机连接的例程.对应的监听日志文件里面错误为TNS-1252 ...

  3. MYSQL多实例配置方法 mysqld_multi方法

    在实际的开发过程中,可能会需要在一台服务器上部署多个MYSQL实例,那建议使用MYSQL官方的解决方案 mysqld_multi 1.修改my.cnf 如一个定义两个实例的参考配置: [mysqld_ ...

  4. SOA架构设计经验分享—架构、职责、数据一致性

    阅读目录: 1.背景介绍 2.SOA的架构层次 2.1.应用服务(原子服务) 2.2.组合服务 2.3.业务服务(编排服务) 3.SOA化的重构 3.1.保留服务空间,为了将来服务的组合 4.运用DD ...

  5. sql server: sql script

    select ProductGUID,ProductName,ProjectGUID from dbo.Product /* F637A079-E22B-4E50-87E9-000147B1B1F4 ...

  6. 在Windows上安装虚拟机详细图文教程

    用虚拟机来安装最新的软件,安装最新的系统等等比较保险,可以避免安装不顺利影响自己原来的系统和应用,想尝鲜又担心自己完全更换系统不适应的朋友可以尝试. 虚拟机下载:https://yunpan.cn/c ...

  7. web服务器选择Apache还是Nginx

    首先我们来谈谈老朋友Apache,Apache HTTP Server(简称Apache)是世界使用排名第一的Web服务器软件,音译为阿帕奇,是Apache软件基金会的一个开放源码Web服务器,可以运 ...

  8. 如何使用 Entity Framework 构造动态查询表达式

    一般的程序员做上几年以后, 或多或少的都有些代码的积累, 我也不例外. 作为微软技术程序员, 自从Linq和EF出来之后, 就基本上爱不释手了, 且不说执行效率的问题, 单单就开发效率和代码的可移植性 ...

  9. [WPF系列]基础学习(一) WPF是什么?

    引言 学习之前,我们首先大概了解下WPF诞生的背景以及它所能解决的问题或者新颖之处.WPF作为微软新一代的用户界面技术,   WPF简介 WPF的全称是WindowsPresentationFound ...

  10. C#基础---Attribute(标签) 和 reflect(反射) 应用

    1.Attribute的定义与作用: 公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法和属性等.Attributes和Micros ...