相关文章
前面我们分析了一下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浅析》了解。