201709011工作日记--Volley源码详解(三)
1. RequestQueue类
我们使用 Volley 的时候创建一个 request 然后把它丢到 RequestQueue 中就可以了。那么来看 RequestQueue 的构造方法,含有四个参数的构造器是最终会调用的构造器。
1 public RequestQueue(Cache cache, Network network, int threadPoolSize, 2 ResponseDelivery delivery) { 3 mCache = cache; 4 mNetwork = network; 5 mDispatchers = new NetworkDispatcher[threadPoolSize]; 6 mDelivery = delivery; 7 } 8 //三参数调用四参数的构造方法,并且创建了线程池分发器 9 public RequestQueue(Cache cache, Network network, int threadPoolSize) { 10 this(cache, network, threadPoolSize, 11 new ExecutorDelivery(new Handler(Looper.getMainLooper()))); 12 } 13 private static final int DEFAULT_NETWORK_THREAD_POOL_SIZE = 4; 14 //二参调用三参数的构造方法,并且传了默认的线程池大小=4 15 public RequestQueue(Cache cache, Network network) { 16 this(cache, network, DEFAULT_NETWORK_THREAD_POOL_SIZE); 17 } 18 //关键的方法,创建出四个网络请求分发器和一个缓存网络分发器 19 public void start() { 20 stop(); //保证现在运行的网络请求分发器都关闭 21 //创建缓存网络请求分发器并启动 22 mCacheDispatcher = new CacheDispatcher(mCacheQueue, mNetworkQueue, mCache, mDelivery); 23 mCacheDispatcher.start(); 24 //创建四个网络请求分发器并启动 25 for (int i = 0; i < mDispatchers.length; i++) { 26 NetworkDispatcher networkDispatcher = new NetworkDispatcher(mNetworkQueue, mNetwork, 27 mCache, mDelivery); 28 mDispatchers[i] = networkDispatcher; 29 networkDispatcher.start(); 30 } 31 }
一个消息请求队列的构造函数,一个开启函数,
创建了一个线程池分发器(ExecutorDelivery) ,四个网络请求分发器 (NetworkDispatcher ),一个缓存网络请求分发器(CacheDispatcher)。
它的参数有哪些呢?
- mSequenceGenerator:序列号生成器
- mWaitingRequests:hashmap 通过 method + url 为key,重复 request 组成的 queue 为value
- mCurrentRequests:HashSet 存储包括正在执行和等待所有的 request
- mCacheQueue:PriorityBlockingQueue 缓存队列
- mNetworkQueue:PriorityBlockingQueue 网络请求队列
- DEFAULT_NETWORK_THREAD_POOL_SIZE 网络请求线程池大小
- mCache 接口 具体实现由构造器传入
- mNetwork 同上
- mDelivery 结果分发器
- mDispatchers 网络调度数组
-
mCacheDispatcher 缓存调度
RequestQueue 中一共有五个主要的方法,分别是 start、add、stop、cancel、finish 我们先看刚才遇到的 start 方法中开启了一个缓存和四个网络请求器,但是在启动时候首先调用了stop方法:
1 /** 2 * 停止缓存和网络调度 3 * Stops the cache and network dispatchers. 4 */ 5 public void stop() { 6 if (mCacheDispatcher != null) { 7 mCacheDispatcher.quit(); 8 } 9 for (final NetworkDispatcher mDispatcher : mDispatchers) { 10 if (mDispatcher != null) { 11 mDispatcher.quit(); 12 } 13 } 14 }
stop 调用了分别调用了 mCacheDispatcher和NetworkDispatcher的quit,那么疑问来了,dispatcher 的 quit 是干嘛呢?我们跟进代码:
public class CacheDispatcher extends Thread { public class NetworkDispatcher extends Thread {
CacheDispatcher 和 NetworkDispatcher 都继承自Thread,start 方法自然是开启一个新的线程那quit,一定是关闭线程了,看一下 Volley 是怎么实现的
1 public void quit() { 2 mQuit = true; 3 interrupt(); 4 }
1 @Override 2 public void run() { 3 while (true) { 4 if (mQuit) { 5 return; 6 } 7 } 8 }
我们忽略具体实现可以看到,run 方法里面是一个 while true 的无限循环,然后用以个标记字段,来控制循环退出。 所以 start 方法做的的事情就很清楚了,先 stop 掉跑着的线程,然后开启一个缓存线程, 一组(默认四个)网络线程,每个里面都有一个while ture 死循环。等待 request add 到 Requestqueue 中,接下来我们就来看五个主要方法中的 add。