Android 谷歌 开源 通信框架 VOLLEY(五)——源码架构设计

来源:互联网 发布:网络直播都有什么内容 编辑:程序博客网 时间:2024/06/05 02:43

四、架构设计

我们已经知道了volley的种种功能,但是大家肯定不满足。volley是开源的,这就造福了亿万的程序员。
下面我们打开volley最后一层,深入架构设计。
这里写图片描述

当客户端在请求网络数据的时候,是需要消耗流量的,特别是对于移动端用户来说,对于流量的控制要求很高。所以在做网络请求的时候,如果对数据更新要求不是特别高,往往都会用到缓存机制,一方面能减少对服务端的请求,控制流量;另一方面,当客户端在没有网络的情况下也能看到上一次请求的数据,这样使用户体验更佳。

volley默认启用缓存的。
这里写图片描述

Volley请求流程如下:
这里写图片描述
蓝色部分代表主线程,
绿色部分代表缓存线程,
橙色部分代表网络线程。

我们在主线程中调用RequestQueue的add()方法来添加一条网络请求,这条请求会先被加入到缓存队列当中,如果发现可以找到相应的缓存结果就直接读取缓存并解析,然后回调给主线程。如果在缓存中没有找到结果,则将这条请求加入到网络请求队列中,然后处理发送HTTP请求,解析响应结果,写入缓存,并回调主线程。

这里写图片描述
缓存是否过期,通过 response 的头部信息:Cache-control字段和Expires、Date字段来判断。
这里写图片描述
如果是第一次请求,或者缓存已过期,肯定是无法获取到缓存的,这时可根据上图分析,将会进入网络请求线程NetworkDispatcher.
在网络请求线程请求到数据以后,会交给用户解析,并把数据转换一份成缓存数据,把数据缓存起来。

内部原理:RequestQueue会维护一个缓存调度线程(cache线程)和一个网络调度线程池(net线程)(注意,这是一池子线程),当一个Request被加到队列中的时候,cache线程会把这个请求进行筛选:如果这个请求的内容可以在缓存中找到,cache线程会亲自解析相应内容,并分发到主线程(UI)。如果缓存中没有,这个request就会被加入到另一个NetworkQueue,所有真正准备进行网络通信的request都在这里,第一个可用的net线程会从NetworkQueue中拿出一个request扔向服务器。当响应数据到的时候,这个net线程会解析原始响应数据,写入缓存,并把解析后的结果返回给主线程。

这里写图片描述

源码可以参考这里:
http://blog.csdn.net/fengqiaoyebo2008/article/details/42963915
http://blog.csdn.net/jxxfzgy/article/details/44088299
http://blog.csdn.net/guolin_blog/article/details/17656437
http://blog.csdn.net/geolo/article/details/43966171
http://www.w2bc.com/Article/20215

3 0
原创粉丝点击