1. 程式人生 > >Android網路框架volley學習(三)底層網路請求分析

Android網路框架volley學習(三)底層網路請求分析

相關文章

前面我們分析了一下volley的基本用法及總體工作流程,由於volley是一個網路請求框架,所以本篇我們分析一下它的底層網路請求。

volley原始碼說長不長,說短不短,也有幾十個類,該從哪裡開始分析呢?我們從最基本的開始分析,還記得一開始進行傳送請求的程式碼麼?

 RequestQueue queue = Volley.newRequestQueue(this);

首先構造一個請求佇列,然後再構造一個請求,最後將請求add進請求佇列中。我們就先從這個newRequestQueue開始分析。

原始碼路徑com.android.volley.toolbox.Volley#newRequestQueue


首先進入到Volley原始碼中,發現它呼叫了另外一個建構函式:

public static RequestQueue newRequestQueue(Context context, BaseHttpStack stack) {
        BasicNetwork network;
        if (stack == null) {
            if (Build.VERSION.SDK_INT >= 9) {
                network = new BasicNetwork(new HurlStack());
            } else
{ // Prior to Gingerbread, HttpUrlConnection was unreliable. // See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html // At some point in the future we'll move our minSdkVersion past Froyo and can // delete this fallback (along with all Apache HTTP code).
String userAgent = "volley/0"; try { String packageName = context.getPackageName(); PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0); userAgent = packageName + "/" + info.versionCode; } catch (NameNotFoundException e) { } network = new BasicNetwork( new HttpClientStack(AndroidHttpClient.newInstance(userAgent))); } } else { network = new BasicNetwork(stack); } return newRequestQueue(context, network); }

在上面的程式碼中,首先進行SDK的版本判斷,在api為9的時候進行一個分界線,從程式碼中可以看出,在API9之前,網路底層使用的是Apache的HttpClient,在API9之後使用的是Java的HttpURLConnection,而且在6.0中,Google直接刪除了HttpClient。如果在6.0裡面還要使用這個類的話,需要在build.gradle 中增加以下程式碼:

android {
       useLibrary 'org.apache.http.legacy'
} 

好了,我們繼續回到原始碼分析上來,當前方法內部會根據當前系統的版本號呼叫不同的網路連線請求類(HttpUrlConnection和HttpClient)。然後生成一個BasicNetwork物件network來充當newRequestQueue的引數,我們接著分析newRequestQueue方法。

    private static RequestQueue newRequestQueue(Context context, Network network) {
        File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);
        RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);
        queue.start();
        return queue;
    }

RequestQueue類有快取和network兩個引數組成,從上面獲取了這兩個引數,然後RequestQueue開始工作,我們想先暫且部分西RequestQueue,本篇主要分析網路請求底層的實現。

1)API9之前的HttpClientStack
我們首先來看下API9之前的網路實現。主要涉及到的類是HttpClientStack,我們進入到HttpClientStack類裡面檢視一下原始碼實現。

原始碼路徑com.android.volley.toolbox.HttpClientStack

看這個類的註釋說HttpClientStack已經Deprecated的了,我們也大概瞭解一下。這個類的內部實現是HttpClient,這裡面主要涉及到常見的幾種請求方法:

  /**
     * Supported request methods.
     */
    public interface Method {
        int DEPRECATED_GET_OR_POST = -1;
        int GET = 0;
        int POST = 1;
        int PUT = 2;
        int DELETE = 3;
        int HEAD = 4;
        int OPTIONS = 5;
        int TRACE = 6;
        int PATCH = 7;
    }

有興趣的話可以深入瞭解如何實現的。

2)API9之後的HurlStack

原始碼路徑com.android.volley.toolbox.HurlStack
再API9之後,它的底層網路實現改成了Java的HttpURLConnection了

以上便是volley的底層網路請求實現,主要是通過API的版本進行判斷選擇使用哪個請求方式,如果API<9的話則選擇Apache的HttpClient,如果>=9的話,則使用Java的HttpURLConnection。關於這兩個具體的用法,可以參考這篇《HttpURLConnection與HttpClient淺析》瞭解。