Volley分析

初始化

Volley分析

1、创建BaseNetwork(new Httpstack), HttpStack 有BaseHttpStack 和 HurlStack和HttpClientStack, hurlStack内部是HttpURLConnection实现,HttpClientStack内部是HttpClient实现,sdk>9则HttpURLConnection实现,反之HttpClient实现。

2、创建RequestQueue对象,RequestQueue内部有如下对象:

(1) NetworkDispatcher[]:线程数组,默认大小为4,也就是说有4个网络工作子线程。
(2) CacheDispathcer:缓存子线程,1个缓存子线程,当请求的数据在本地有的话,会调用此线程,缓存线程会在本地获取数据。
(3) CacheQueue :Request缓存阻塞队列,内部存储的是Request,当一个Request被判定是可以在缓存中获取数据,则会被加入到此队列,然后缓存线程从此队列获取Request,通过Request.CacheKey=Url;获取Response数据。
(4) NetworkQueue:Request网络阻塞队列,阻塞队列解决线程的并发性,因为有四个网络子线程,属于多线程,所以保证一个Request必须被一个子线程执行,阻塞队列可以保证解决并发。
(5) BaseNetwork :获取Response结果。默认通过hurlStack->HttpURLConnection获取Response,此时的Response在还在子线程。
(6) ExecutorDelivery :负责将Response返回给主线程,通过Handle.post(runable),将Response返回到主线程,调用successListener或者failListener。
(7) DiskBasedCache :缓存数据类。

3、RequestQueue.start():
(1)NetworkDispatcher.start(),四个网络子线程开启,并且Run方法内部是while(ture),一个死循环,内部一直不断从NetworkQueue中获取Request.
(2) CacheDispathcer.start(),缓存子线程开启,并且run方法内部为while(ture),一直不断从CacheQueue获取request。

添加Request

RequestQueue.add(Request),判断Request是否加入缓存队列,来判断加入NetworkQueue还是CacheQueue。

网络线程执行请求到返回到主线程Response过程

Volley分析
(1)、从NetWorkQueue中获取Reuqest,图中没画出。
(2)、BaseNetWork.performRequest()内部调用Httpstack.executeRequest(),Httpstack.executeRequest()内部调用默认的网络链接方式HttpUrlConnection获取Response。
(3)、获取的Response传递给 ExecutorDelivery,ExecutorDelivery将Response传递给Executor,Executor传递Handle,handle将Response传递个主线程中的开发者自定义回调监听。

缓存线程执行请求过程

(1) 和网络请求流程的差别就是,在本地获取数据,如果缓存数据过期,或者改变,则将获取的Request加入到加入到NetWorkQueue中。