研究了這么久的Volley,愈來愈發現這個框架的精美和人性化。比起民間一些框架強很多,一開始總是盲人摸象找不到頭緒,現在終於有些明朗了。Volley其實就是一個請求隊列的代理類,我們看下UML。

這就是Volley的網絡請求中心樞紐,我們重頭再梳理一下。
首先通過Volley類建立一個請求隊列RequestQueue,這個隊列可以定制個線程池規定多少個線程跑,一個NetworkDispatche對象就是一個線程,而加入進隊列的請求就根據工作調度機制由一個NetworkDispatche線程去執行。而NetworkDispatche的請求執行是通過Network的現實類BasicNetwork代勞,而底層原生的http請求就是通過HttpStack實現類就是上圖的兩個HttpClientStack和HurlStack執行。這兩個類的區別在於HttpClientStack是直接用HttpClient的execute()方法執行一個Http請求,而HurlStack就是直接用URL.openConnection()進行連接,這種方式在2.3以上是不能用的,所以分開了這兩種方式。
我們看下這里有幾個轉換解析請求獲取響應結果的地方:
1.HttpStack接口的performRequest()方法
public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders)
2.Network接口的performRequest()方法
public NetworkResponse performRequest(Request<?> request)
3.Request類的parseNetworkResponse()抽象方法
abstract protected Response<T> parseNetworkResponse(NetworkResponse response);
可以很鮮明得看出第一個是對原生Http請求的解析,解析出來是一個Apach的HttpResponse 實例,這個結果就是通過上述兩個HttpStack的實現類HttpClientStack和HurlStack執行獲取的獲取的。而第二個解析出來是框架自定的NetworkResponse,這是通過Network的實現類BasicNetwork來獲取的。第三個就是第二個得出來NetworkResponse解析成用戶期望Response<T> 了,這個Response和Request是對應的,有String型,json型還有Image型的。然后在通過ResponseDelivery把解析好的結果發送到主線程。
從Request到Response就是這樣一步步走來的。
我們再回過頭看一眼Volley的概括吧
public static RequestQueue newRequestQueue(Context context, HttpStack stack) { File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);//緩存目錄 String userAgent = "volley/0";//UA try { String packageName = context.getPackageName(); PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0); userAgent = packageName + "/" + info.versionCode; } catch (NameNotFoundException e) {//如果沒獲取到包信息那UA就還是volley/0 } if (stack == null) {//如果調用的是默認的構造器 if (Build.VERSION.SDK_INT >= 9) {//2.3以上sdk stack = new HurlStack(); } else {//2.3以下不能用HttpUrlConnection? // Prior to Gingerbread, HttpUrlConnection was unreliable. // See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent)); } } Network network = new BasicNetwork(stack);//通過HttpStack創建一個BasicNetwork#performRequest RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);//Cache,Network queue.start(); return queue; }
