Volley通过工具包里的Volley.java类进行初始化消息队列的工作,初始化主要做了以下工作:1 创建网络访问实例 2 创建缓存 3创建消息队列并启动
Volley.java提供两种初始化消息队列的方法:1 newRequestQueue(Context context);2 newRequestQueue(Context context, HttpStack stack)
方法1使用系统默认的网络访问实例,方法2给用户提供了自定义网络访问实例,下面我们详细看看方法2是怎么实现的:
/**
* Creates a default instance of the worker pool and calls {@link RequestQueue#start()} on it.
*
* @param context A {@link Context} to use for creating the cache dir.
* @param stack An {@link HttpStack} to use for the network, or null for default.
* @return A started {@link RequestQueue} instance.
*/
public static RequestQueue newRequestQueue(Context context, HttpStack stack) {
File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);
String userAgent = "volley/0";
try {
String packageName = context.getPackageName();
PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);
userAgent = packageName + "/" + info.versionCode;
} catch (NameNotFoundException e) {
}
//如果网络访问对象为空,则由系统指定对应的网络请求实例
if (stack == null) {
//如果android的版本高于9,则使用HurlStack,否则使用HttpClientStack
if (Build.VERSION.SDK_INT >= 9) {
stack = new HurlStack();
} else {
// 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);
//创建磁盘缓存和请求消息队列,并启动消息队列
RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);
queue.start();
return queue;
}
下面将对网络请求和请求消息队列进行详细分析。