您的位置:首页 > 移动开发 > Android开发

Volley 启动流程

2016-07-26 09:26 591 查看
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的请求
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android volley