Volley 启动流程:
1.调用Volley类中的静态方法:newRequestQueue 方法 创建RequestQueue 请求队列
2.newRequestQueue 方法:根据当前的API,来决定使用具体的HttpStack ,使用的是策略模式
如果大于9,则使用HTTPUrlConnection,如果小于9,则使用Apache HttpClient
3.Network network = new BasicNetwork(stack);
RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir),network); //创建一个具体的请求队列
queue.start(); //启动RequestQueue
4.
mCacheDispatcher = new CacheDispatcher(mCacheQueue, mNetworkQueue, mCache, mDelivery);mCacheDispatcher.start();
// 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();
}
同时启动线程:缓存线程CacheDispatcher、网络请求线程NetworkDispatcher(默认开启4个线程),其中两者共用mNetworkQueue队列
mDelivery指向的是 new ExecutorDelivery(new Handler(Looper.getMainLooper())),从而可以看出postResponse方法最后的执行都是在UI线程中
5.缓存线程run方法:
不断的while循环,从缓存队列中获取request对象 Request<?> request = mCacheQueue.take();
如果request cancel了,则finish不做任何的调度分发
如果没cancel,根据request的getCacheKey() 从cache中获取Cache.Entry 数据
如果获取到的entry为null,则将request加入到NetworkQueue中等待执行
如果获取到的entry过期了,则也会将request加入到NetworkQueue中
如果既不为null也没有过期,则执行request.parseNetworkResponse 获取Response对象
如果entry 不需要refresh,则直接执行交付操作:mDelivery.postResponse(request, response);
如果entry 需要refresh,继续执行mDelivery.postResponse,并在执行完之后通过mNetworkQueue.put(request); 加入到NetworkQueue中等待执行
6.网络请求线程run方法:
同缓存线程的run方法,相差不大,开头也是从mQueue不断的获取request对象
NetworkResponse networkResponse = mNetwork.performRequest(request);
然后通过mNetwork 执行performRequest ,去执行http请求 获取response
调用BasicNetWork中的performRequest方法
在performRequest方法中,会调用具体的HttpStack 的 performRequest方法去执行http的请求
1.调用Volley类中的静态方法:newRequestQueue 方法 创建RequestQueue 请求队列
2.newRequestQueue 方法:根据当前的API,来决定使用具体的HttpStack ,使用的是策略模式
如果大于9,则使用HTTPUrlConnection,如果小于9,则使用Apache HttpClient
3.Network network = new BasicNetwork(stack);
RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir),network); //创建一个具体的请求队列
queue.start(); //启动RequestQueue
4.
mCacheDispatcher = new CacheDispatcher(mCacheQueue, mNetworkQueue, mCache, mDelivery);mCacheDispatcher.start();
// 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();
}
同时启动线程:缓存线程CacheDispatcher、网络请求线程NetworkDispatcher(默认开启4个线程),其中两者共用mNetworkQueue队列
mDelivery指向的是 new ExecutorDelivery(new Handler(Looper.getMainLooper())),从而可以看出postResponse方法最后的执行都是在UI线程中
5.缓存线程run方法:
不断的while循环,从缓存队列中获取request对象 Request<?> request = mCacheQueue.take();
如果request cancel了,则finish不做任何的调度分发
如果没cancel,根据request的getCacheKey() 从cache中获取Cache.Entry 数据
如果获取到的entry为null,则将request加入到NetworkQueue中等待执行
如果获取到的entry过期了,则也会将request加入到NetworkQueue中
如果既不为null也没有过期,则执行request.parseNetworkResponse 获取Response对象
如果entry 不需要refresh,则直接执行交付操作:mDelivery.postResponse(request, response);
如果entry 需要refresh,继续执行mDelivery.postResponse,并在执行完之后通过mNetworkQueue.put(request); 加入到NetworkQueue中等待执行
6.网络请求线程run方法:
同缓存线程的run方法,相差不大,开头也是从mQueue不断的获取request对象
NetworkResponse networkResponse = mNetwork.performRequest(request);
然后通过mNetwork 执行performRequest ,去执行http请求 获取response
调用BasicNetWork中的performRequest方法
在performRequest方法中,会调用具体的HttpStack 的 performRequest方法去执行http的请求