由于即将在项目中用到volley框架作为网络通信框架,所以把volley仔细看了一下。首先宏观角度讲下volley框架的大致结构 见下图:
主线程:产生一个请求对象并加入请求队列中
缓冲线程:从请求队列中取出请求对象并经过一系列判断来确定是直接使用本定缓冲响应数据还是进行网络请求。(yes)说明本地缓存数据可用,直接传递给主线程更新view等界面操作,(no)说明本地缓存不可用或无缓存数据则进行网络数据请求
网络线程:直接进行网络数据的请求,并将响应数据进行缓存和传递主线程更新
下面直接从代码方面讲解volley,volley框架代码本不是很多,写的也比较好懂 ,主要有以下源文件
com/android/volley/toolbox/Volley.java
com/android/volley/RequestQueue.java
com/android/volley/CacheDispatcher.java
com/android/volley/NetworkDispatcher.java
com/android/volley/ExecutorDelivery.java
com/android/volley/Response.java
com/android/volley/toolbox/DiskBasedCache.java
Volley类提供了好几个实例化RequestQueue对象的重载方法,但最终都会调到以下的方法,只是初始化的参数不同而已
public static RequestQueue newRequestQueue(Context context, HttpStack stack, int maxDiskCacheBytes) {
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) {
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;
if (maxDiskCacheBytes <= -1)
{
// No maximum size specified
queue = new RequestQueue(new DiskBasedCache(cacheDir), network);
}
else
{
// Disk cache size specified
queue = new RequestQueue(new DiskBasedCache(cacheDir, maxDiskCacheBytes), network);
}
queue.start();
return queue;
}
此方法中会去实例化一个请求队列对象并传入一个本地缓存对象和一个网络对象。
public RequestQueue(Cache cache, Network network, int threadPoolSize,
ResponseDelivery delivery) {
mCache = cache;
mNetwork = network;
mDispatchers = new NetworkDispatcher[threadPoolSize];
mDelivery = delivery;
}
/**
* Creates the worker pool. Processing will not begin until {@link #start()} is called.
*
* @param cache A Cache to use for persisting responses to disk
* @param