谷歌Volley網絡框架講解——網絡樞紐


研究了這么久的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;
    }

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM