Volley底层实现解释笔记

来源:互联网 发布:网络流行的词 编辑:程序博客网 时间:2024/06/05 09:39

Volley源码

volley特别适合数据量小,通信频繁的网络操作

 Volley的总体设计是通过两种Dispatch Thread不断从RequestQueue中取出请求,根据是否已缓存调用CacheNetwork这两类数据获取接口之一,从内存缓存或是服务器取得请求的数据,然后交由ResponseDelivery去做结果分发及回调处理。

 

首先在volley类中通过newrequestqueue构建一个可用于添加网络请求的RequestQueue对象,newrequestqueue有两个重载的静态方法,在两个参数的静态方法中,第二个参数httpstack默认为null,如果api小于9,则采用基于基于HttpClient HttpClientStack,如果大于等于9采用基于HttpURLConnection HurlStack

 

接着再用这个创建好的stack构造一个代表网络的具体实现,再构造一个基于缓冲的具体实现,然后将网络(Network)对象和缓存(Cache)对象传入构建一个RequestQueue,启动这个RequestQueue

 

然后在requestQueue类中,维护了两个基于优先级的Request 队列,缓存请求队列和网络请求队列,维护了一个正在进行中,尚未完成的请求集合,维护了一个等待请求的集合,如果一个请求正在被处理并且可以被缓存,后续的相同url 的请求,将进入此等待队列。调用start 方法,启动队列。Start方法中,开启一个缓存调度线程CacheDispatchern 个网络调度线程NetworkDispatcher

 

具体流程是,

请求到来--------加入当前请求队列--为请求添加唯一序列号------------请求是否允许缓存---------不允许则将请求添加到网络请求队列中,允许则判断当前是否有相同请求正在被处理----------是则加入到相同请求的等待队列中,否则加入到缓存请求队列。


 

初始化缓存----------循环开始------缓存调度线程从缓存队列取一个request-------从缓存mCache获取结果--------结果不存在或者过期则将请求加入到网络请求队列,否则将缓存结果解析为response传输给主线程-------缓存结果不新鲜在把response传输给主线程后将请求加入到网络队列中做新鲜度验证。


 

循环开始----------网络调度线程从网络请求队列取一个request-----------执行request请求,获取networkresponse304响应,并且请求已经有响应传输,请求结束【用来做新鲜度验证】)---------networkresponse响应解析为response----------请求可以被缓存且请求结果缓存实体不为空则将请求缓存结果加入到缓存中,否则传输响应结果到主线程


 

HttpURLConnectionAndroidHttpClient(HttpClient的封装)如何选择及原因:
Froyo(2.2) 之前,HttpURLConnection有个重大 Bug,调用close() 函数会影响连接池,导致连接复用失效,所以在Froyo 之前使用HttpURLConnection 需要关闭keepAlive
另外在 Gingerbread(2.3) HttpURLConnection默认开启了 gzip压缩,提高了 HTTPS的性能,Ice Cream Sandwich(4.0) HttpURLConnection支持了请求结果缓存。
再加上 HttpURLConnection本身 API相对简单,所以对 Android来说,在 2.3之后建议使用 HttpURLConnection,之前建议使用AndroidHttpClient

1 0