Volley底层实现解释笔记

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

 

具体流程是,

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

Volley底层实现解释笔记_第1张图片

 

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

Volley底层实现解释笔记_第2张图片

 

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

Volley底层实现解释笔记_第3张图片

 

HttpURLConnection AndroidHttpClient(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

你可能感兴趣的:(Android)