Volley源码分析

下面是Volley的基本用法:


Volley源码分析_第1张图片

看到上图的第一步,创建请求队列,我们跟进去看看具体情况:

Volley源码分析_第2张图片

接下去看上图标记A处:


Volley源码分析_第3张图片
image.png

看到上图的B处:
创建了请求队列对象,然后调用了start方法,进去看下start方法如何工作吧:


Volley源码分析_第4张图片

看上图D处:
创建了一个CacheDispatcher对象,并调用了start方法,这哥们是啥玩意呢?实际上这哥们继承自Thread,进入查看呗:
Volley源码分析_第5张图片
image.png

所以CacheDispatcher调用了start方法之后,run方法会被调用:


Volley源码分析_第6张图片
image.png

Volley源码分析_第7张图片

上图中从缓存队列取出一个请求对象,然后在调用processRequest,至于缓存队列是什么时候入队一个值的这里先存档下文在讨论,先标记D1吧:
Volley源码分析_第8张图片
image.png
Volley源码分析_第9张图片

看到标记D2,mDelivery对象是ResponseDelivery,本身ResponseDelivery是一个接口,往后追踪到这里:


Volley源码分析_第10张图片

可见这兄弟是ExecutorDelivery,哎呦,创建这个对象还传了一个handler(在主线程处理消息的),所以上文mDelivery.postResponse其实是ExecutorDelivery的postResponse方法,我们可以猜猜看,这个方法里面通过Handler来传递Response???是这样吗,进去看看:

Volley源码分析_第11张图片
Volley源码分析_第12张图片

看到上面两图,也基本证实上面的猜想,继续如下:


Volley源码分析_第13张图片

看到上图,继续D3:


Volley源码分析_第14张图片

回顾上文分析情况,到这里我们先总结一下:
创建请求队列的时候,会创建一个CacheDispatcher线程,在这个线程中首先会从缓存队列去一个请求,然后看看时候命中缓存,命中则返回结果,不命中则将请求加入网络请求队列,等候执行网络请求。

除了创建CacheDispatcher线程以外,还会创建多条(默认4条)NetWorkDispatcher线程,这个线程当然是来执行网络请求的啦:


Volley源码分析_第15张图片
image.png

Volley源码分析_第16张图片
image.png

Volley源码分析_第17张图片
image.png

Volley源码分析_第18张图片

到这里最主要的请求如何调度,以及响应结果如何传递,剩下没有分析的只有文章开头的第三部,请求入队:


Volley源码分析_第19张图片
Volley源码分析_第20张图片

好啦,上面代码很简单,到此Volley源码分析完毕,其实也是比较简单的,看到Volley源码后也是很佩服作者的设计的,哈哈,一个活生生的多线程编程,在最后总结之前邀请你欣赏一张图:


Volley源码分析_第21张图片

这张图是官网介绍Volley的工作流程的,很牛逼有木有,通过上文的分析此图应该是很容易阅读理解的。。。

总结

Volley在创建请求队列的时候会创建一个CacheDispatcher线程和多条NetWorkDispatcher线程(默认4条),CacheDispatcher线程会从缓存队列取出一个请求检查是否缓存命中,命中则通过回调返回结果,没有命中则将请求加入网络请求队列。而NetWorkDispatcher线程则从网络请求队列中获取一个请求,执行网络请求,然后根据具体需要判断是否缓存并返回结果。

你可能感兴趣的:(Volley源码分析)