Volley源码分析
下面是Volley的基本用法:
![](https://img.haomeiwen.com/i4447058/1e4a0272e1315d2e.png)
看到上图的第一步,创建请求队列,我们跟进去看看具体情况:
![](https://img.haomeiwen.com/i4447058/b8772a94e3bda9be.png)
接下去看上图标记A处:
![](https://img.haomeiwen.com/i4447058/9404d7e3ef15f29c.png)
看到上图的B处:
创建了请求队列对象,然后调用了start方法,进去看下start方法如何工作吧:
![](https://img.haomeiwen.com/i4447058/338a1bdf5e3155ad.png)
看上图D处:
创建了一个CacheDispatcher对象,并调用了start方法,这哥们是啥玩意呢?实际上这哥们继承自Thread,进入查看呗:
![](https://img.haomeiwen.com/i4447058/3d13ddfe4df29261.png)
所以CacheDispatcher调用了start方法之后,run方法会被调用:
![](https://img.haomeiwen.com/i4447058/9a8895eb3e71a470.png)
![](https://img.haomeiwen.com/i4447058/2f42f0378ec4100d.png)
上图中从缓存队列取出一个请求对象,然后在调用processRequest,至于缓存队列是什么时候入队一个值的这里先存档下文在讨论,先标记D1吧:
![](https://img.haomeiwen.com/i4447058/01002f55d6ac9760.png)
![](https://img.haomeiwen.com/i4447058/62202fd558b2e2ad.png)
看到标记D2,mDelivery对象是ResponseDelivery,本身ResponseDelivery是一个接口,往后追踪到这里:
![](https://img.haomeiwen.com/i4447058/2aa86da3b8eaf613.png)
可见这兄弟是ExecutorDelivery,哎呦,创建这个对象还传了一个handler(在主线程处理消息的),所以上文mDelivery.postResponse其实是ExecutorDelivery的postResponse方法,我们可以猜猜看,这个方法里面通过Handler来传递Response???是这样吗,进去看看:
![](https://img.haomeiwen.com/i4447058/50cade281b75a654.png)
![](https://img.haomeiwen.com/i4447058/462ecdc777e1369d.png)
看到上面两图,也基本证实上面的猜想,继续如下:
![](https://img.haomeiwen.com/i4447058/9a4f6b8b0c19903c.png)
看到上图,继续D3:
![](https://img.haomeiwen.com/i4447058/4b486e98e830dadc.png)
回顾上文分析情况,到这里我们先总结一下:
创建请求队列的时候,会创建一个CacheDispatcher线程,在这个线程中首先会从缓存队列去一个请求,然后看看时候命中缓存,命中则返回结果,不命中则将请求加入网络请求队列,等候执行网络请求。
除了创建CacheDispatcher线程以外,还会创建多条(默认4条)NetWorkDispatcher线程,这个线程当然是来执行网络请求的啦:
![](https://img.haomeiwen.com/i4447058/a3c1d1909635eac4.png)
![](https://img.haomeiwen.com/i4447058/c769f2d93050c300.png)
![](https://img.haomeiwen.com/i4447058/553eaac788416b42.png)
![](https://img.haomeiwen.com/i4447058/f06f12711dde1998.png)
到这里最主要的请求如何调度,以及响应结果如何传递,剩下没有分析的只有文章开头的第三部,请求入队:
![](https://img.haomeiwen.com/i4447058/9b7cc765be51d27f.png)
![](https://img.haomeiwen.com/i4447058/71077bfe94b75122.png)
好啦,上面代码很简单,到此Volley源码分析完毕,其实也是比较简单的,看到Volley源码后也是很佩服作者的设计的,哈哈,一个活生生的多线程编程,在最后总结之前邀请你欣赏一张图:
![](https://img.haomeiwen.com/i4447058/eee7b7897426ad88.png)
这张图是官网介绍Volley的工作流程的,很牛逼有木有,通过上文的分析此图应该是很容易阅读理解的。。。
总结
Volley在创建请求队列的时候会创建一个CacheDispatcher线程和多条NetWorkDispatcher线程(默认4条),CacheDispatcher线程会从缓存队列取出一个请求检查是否缓存命中,命中则通过回调返回结果,没有命中则将请求加入网络请求队列。而NetWorkDispatcher线程则从网络请求队列中获取一个请求,执行网络请求,然后根据具体需要判断是否缓存并返回结果。