这里只是一个队 Volley 做一个简要的分析,权当是自己的一个记录,详情异步至 Volley 源码分析
1、Request 抽象类,用于网络请求
子类需要实现的方法:
deliverResponse(T response) 分发结果;
parsetNetworkResponse(NetwokResponse response) 将网络请求回来的数据,转化成请求的数据格式;
直接子类:
ImageRequest, JsonArrayRequest, JsonObjectRequest, JsonRequest, StringRequest;
2、Network 接口, 请求网络数据
BasicNetwork 是实现该接口方法类, performRequest();
3、HttpStack, 接口,HTTP 请求
方法: performRequest();
实现类:
HurlStack() 基于 HttpURLConnection , SDK >= 9 版本以上;
HttpClientStack() 基于 HttpClient, SDK < 9 版本以下;
4、CacheDispatcher , 一个线程, extends Thread;
5、NetworkDispatcher, 一个线程, extends Thread;
启动四个默认 NetworkDispatcher 线程用于网络请求数据。
6、ResponseDelivery, 接口, 用于分发结果
实现类为 ExecutorDelivery
7、RequestQueue
主要成员:
PriorityBlockingQueue<Request<?>> mCacheQueue 缓存的阻塞队列
PriorityBlockingQueue<Request<?>> mNetworkQueue 网络的阻塞队列
start() 方法,核心的开始
/** * Starts the dispatchers in this queue. * 核心的开始 */ public void start() { stop(); // Make sure any currently running dispatchers are stopped. // Create the cache dispatcher and start it. mCacheDispatcher = new CacheDispatcher(mCacheQueue, mNetworkQueue, mCache, mDelivery); mCacheDispatcher.start(); // 会调用 CacheDispatcher.run() 方法 // Create network dispatchers (and corresponding threads) up to the pool size. for (int i = 0; i < mDispatchers.length; i++) { // 默认为四个 NetworkDispatcher networkDispatcher = new NetworkDispatcher(mNetworkQueue, mNetwork, mCache, mDelivery); mDispatchers[i] = networkDispatcher; networkDispatcher.start(); // 会调用 NetworkDispatcher.run() 方法 } }
1、在 RequestQueue 构建时,生成一个 ExecutorDelivery, 并且传入一个主线程的 Handler;
2、缓存请求和网络请求都是在新开辟的线程中,得到结果后,调用 ResponseDelivery.postResponse 方法
3、在ExecutorDelivery.postResponse 方法中,调用了 Handler, post 回主线程;