美文网首页
Volley的应用以及源码学习(一)

Volley的应用以及源码学习(一)

作者: Hoker_ | 来源:发表于2018-11-05 17:41 被阅读0次

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()这一步:


start().png

从上图代码片段可知,RequestQueue的start()做了两件事:

  • 生成了一个CacheDispatcher
  • 生成了多个NetworkDispatcher(默认是4个)

这两个都是继承于线程Thread,故start()实际上是开启了多个线程(显然,实际工作中要尽量复用RequestQueue队列,减少线程开启的开销)

到这里,RequestQueue的初始化就全部看完了,联系前文的queue.add(imageRequest),显然RequestQueue在添加各种Request后,其会通过CacheDispatcher和NetworkDispatcher来处理这些请求,最后通过Request里用户注册的回调来反馈结果。

2、添加ImageRequest请求到队列
RequestQueue add().png

从上图代码可以看出,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.processRequest() CacheDispatcher.processRequest()

简单点说CacheDispatcher会先从mCacheQueue中读取任务,然后执行。接着从mCache也就是文件缓存中读取缓存,根据读取结果,来判断是否需要将任务加入mNetworkQueue中。

  • NetworkDispatcher
    一样的,NetworkDispatcher也先看其run()方法


    NetworkDispatcher.run()
    NetworkDispatcher.processRequest()

    里面逻辑也很清晰,执行网络请求,将结果放入文件缓存,通知外部结果。

总结:Volley的基本流程弄清楚了,后面将对代码细节做一些分析,比如:Volley是如何释放任务的?Volley一直有5个线程在工作,如何才能不内存泄露呢?这些问题做进一步的学习。

相关文章

网友评论

      本文标题:Volley的应用以及源码学习(一)

      本文链接:https://www.haomeiwen.com/subject/gpmsxqtx.html