Volley框架分析
最近在学习Volley框架,把自己的所得记录下来,一方面方便和大家沟通交流,另一方面也方便自己以后温习,如有不对的地方,请指正。后续会陆续更新介绍Volly重要类的源码。
上图为Volley框架的基本流程图。
1、Volley框架的入口类为Volley类,在Volley类调用以下方法确定网络请求的方式(HttpUrlConnection\DefaultHttpClient)、缓存方法(DiskBasedCache)以及开启子线程处理请求队列(CacheDispatcher以及NetworkDispatcher)。
// 根据android的版本确定网络请求方式,确定缓存方法、以及开启子线程处理请求队列
public static RequestQueue newRequestQueue(Context context, BaseHttpStack stack) {
BasicNetwork network;
if (stack == null) {
if (Build.VERSION.SDK_INT >= 9) {
// SDK高于Android API Level 9(Android 2.2),使用HttpURLConnection做网络请求
network = new BasicNetwork(new HurlStack());
} else { // 使用DefaultHttpClient做网络请求
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);
}
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;
}
2、当要发起一个新的网络请求时,首先将网络请求放入RequestQueue队列,然后根据网络请求的类型(后面文章会详细介绍),CacheDispatcher或者NetworkDispatcher(CacheDispatcher和NetworkDispatcher本质上都是Thead)会将该请求从队列中拿出来进行处理,处理的过程中如果涉及需要发网络请求去服务器获取数据,那么会使用Volley类中创建的网络请求方式(HttpUrlConnection\DefaultHttpClient)来进行具体的网络请求工作。网络请求的结果最终由ExecutorDelivery进行分发。