Volley是google在2013年推出的一个网络库,用于加载图片和网络请求,相比其他图片加载框架,Volley是一个非常简单的开源框架,特别适合初学者来学习使用,这里我会把自己使用学习Volley的经历写下来,供大家参考。
Volley的使用
代码示例:
RequestQueue queue = Volley.newRequestQueue(this); // 初始化RequestQueue队列
ImageRequest imageRequest = new ImageRequest(
"http://baidu.com", //请求图片url
new Response.Listener<Bitmap>() { //请求成功结果处理
@Override
public void onResponse(Bitmap response) {
// 在这里刷新ui
}
},
100, // maxWidth
100, // maxHeight
Bitmap.Config.ARGB_8888, // 图片编码方式
new Response.ErrorListener() { // 请求失败处理
@Override
public void onErrorResponse(VolleyError error) {
}
}
);
queue.add(imageRequest); // 将请求添加进队列
这是最基本的Volley的图片请求,分为2步:
1.初始化RequestQueue队列
2.将创建的ImageRequest请求添加进RequestQueue队列
接下来将一步步的对照源码来分析,主要关注整体流程,具体代码细节暂不考虑
1、初始化RequestQueue队列

对于选择哪种Http类来做网络请求,这里可以先不用关心,只需要知道最终都是继承abstract class BaseHttpStack的类来封装。
从上图代码片段可知,初始化RequestQueue总共分为这么几步:
- 选择合适的网络请求类
- 初始化文件缓存,显然Volley使用了文件缓存
- 调用start()函数,让队列开始工作
前两部后面在细说,这里只看start()这一步:

从上图代码片段可知,RequestQueue的start()做了两件事:
- 生成了一个CacheDispatcher
- 生成了多个NetworkDispatcher(默认是4个)
这两个都是继承于线程Thread,故start()实际上是开启了多个线程(显然,实际工作中要尽量复用RequestQueue队列,减少线程开启的开销)
到这里,RequestQueue的初始化就全部看完了,联系前文的queue.add(imageRequest),显然RequestQueue在添加各种Request后,其会通过CacheDispatcher和NetworkDispatcher来处理这些请求,最后通过Request里用户注册的回调来反馈结果。
2、添加ImageRequest请求到队列

从上图代码可以看出,add()函数就是将request请求,加入到RequestQueue里的两个成员变量mNetworkQueue和mCacheQueue,回头再看下图start()里的生成CacheDispatcher和NetworkDispatcher的代码
CacheDispatcher mCacheDispatcher = new CacheDispatcher(mCacheQueue,
mNetworkQueue, mCache, mDelivery);
NetworkDispatcher networkDispatcher = new NetworkDispatcher(mNetworkQueue,
mNetwork, mCache, mDelivery);
可见他们都用到了mNetworkQueue和mCacheQueue,再通过这两个队列,让CacheDispatcher和NetworkDispatcher来处理任务
简单的说,就是RequestQueue的add方法添加任务到其成员变量mCacheQueue、mNetworkQueue,然后CacheDispatcher和NetworkDispatcher线程运转后,会从各自的队列中读取任务
接下来,就是要看CacheDispatcher和NetworkDispatcher是如何工作的
-
CacheDispatcher
前面说过了,CacheDispatcher本质上是一个线程,那么只需看其run()方法:
CacheDispatcher.run()


简单点说CacheDispatcher会先从mCacheQueue中读取任务,然后执行。接着从mCache也就是文件缓存中读取缓存,根据读取结果,来判断是否需要将任务加入mNetworkQueue中。
-
NetworkDispatcher
一样的,NetworkDispatcher也先看其run()方法
NetworkDispatcher.run()
NetworkDispatcher.processRequest()
里面逻辑也很清晰,执行网络请求,将结果放入文件缓存,通知外部结果。
网友评论