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的请求
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的请求
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories