Android网络框架volley学习(三)底层网络请求分析

相关文章

  1. 《 Android网络框架volley学习(一)基本用法》
  2. 《 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浅析》了解。

你可能感兴趣的:(Android网络框架volley学习(三)底层网络请求分析)