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