volley源码解析

volley请求队列都是基于请求队列的

使用volley之前先要创建requestqueue,如果安卓版本大于2.3则调用基于HTTPURLconnection的呼入量stack,否则就调用基于HTTPclient的httpclientstack,接下来创建requestqueue并调用他的start方法

在start方法中创建了cachedispatcher缓存调度线程,默认情况下网络调度线程数量为4,加一个缓存调度线程线程。

然后创建各种request,如果不能缓存,则将请求添加到网络请求队列中,如果能缓存,就判断之前是否有执行相同的请求而且还没有返回结果的,如果有就加入到waitingrequest队列,如果没有就加入到缓存队列。

Cachedispatcher缓存调度线程

首先从缓存队列取出请求,判断是否请求被取消了,如果请求没有被取消则判断该请求是否有缓存的响应。如果有缓存响应并且没有过期则进行解析并回调给主线程,如果缓存线程没有响应,则将请求加入网络调度线程

Networkdispatcher

网络调度线程也是从队列中取出请求并且判断请求是否取消了,如果该请求没有被取消就去请求网络得到响应并回调给主线程

 

总体来说,volley在创建的时候回默认开启3类线程:主线程,缓存调度线程和网络调度线程,默认开启4个。网络请求首先会加入缓存队列,缓存调度线程从缓存队列中取出请求,如果先到该请求的缓存响应就直接读取缓存的响应并解析,然后回调给主线程,如果没有找到缓存的响应,则将这条请求加入网络队列,然后网络调度线程会轮训取出网络队列中的请求,取出后发送HTTP请求,解析响应并将响应存入缓存,并回调给主线程。

你可能感兴趣的:(volley源码解析)