Volley运行流程及缓存分析
2016-06-24 16:25
453 查看
Volley运行流程:
Volley.java
newRequestQueue(){
stack = new HurlStack();
NetWorknetwork = new BasicNetWork(stack);
RequestQueuequeue = new RequesetQueue(network);
queue.start();
}
RequestQueue.java
public RequestQueue(NetWork network){
this(network,newExecutorDelivery());
}
start(){
mCacheDispatcher = newCacheDispatcher(mCacheQueue, mNetworkQueue, mCache, mDelivery);
mCacheDispatcher.start();
for (int i = 0; i < 4; i++) {
NetworkDispatchernetworkDispatcher = new NetworkDispatcher(
mNetworkQueue,mNetwork, mCache, mDelivery);
mDispatchers[i]= networkDispatcher;
networkDispatcher.start();
}
}
add(Request request){
mNetworkQueue.add(request);
}
NetworkDispatcher.java
extends Thread
run(){
while(true){
Request request =mNetworkQueue.take();
NetWorkResponse networkResponse= mNetwork.performRequest(request);
Response response =request.parseNetworkResponse(networkResponse);
mDelivery.postResponse(request,response);
catch:
mDelivery.postError(request,newVolleyError(e));
}
}
ExecutorDelivery.java
Executor mResponsePoster;
postResponse(Request request,Response response){
mResponsePoster.execute(runnable);
}
postError(Request request){
mResponsePoster.execute(runnable);
}
runnable:
run(){
mRequest.deliverResponse(response.result);
mRequest.deliverError(response.error);
}
Request.java
deliverResponse(){
Response.Listener mListener;
mListener.onResponse(response);
}
deliverError(){
Response.ErrorListener mErrorListener;
mErrorListener.onErrorResponse(error);
}
BasicNetWork.java
performRequest(Request request){
HttpResponse response= mHttpStack.performRequest(request);
Byte[]responseContents = entityToBytes(response.getEntity());
return newNetWorkResponse(responseContents);
}
HurlStack.java
performRequest(Request request){
HttpUrlConnectionconnection…
。。。
inputStream =connection.getInputStream();
response.setEntity(inputStream);
return response;
}
接口缓存:
Volley.java
初始化requestQueue时,
requestQueue = new RequestQueue(new DiskBasedCache(cacheDir),network);
RequestQueue.java
start()方法中初始化Dispatcher时,
mCacheDispatcher = new CacheDispatcher(mCacheQueue,mNetworkQueue, mCache, mDelivery);
networkDispatcher = new NetworkDispatcher(mNetworkQueue,mNetwork, mCache, mDelivery);
CacheDispatcher.java
run()方法中,
Cache.Entry entry =mCache.get(request.getCacheKey());
if(entry==null){
mNetworkQueue.put(request);
continue;
}
if(entry.isExpired()){
mNetworkQueue.put(request);
continue;
}
Response response = request.parseNetwordResponse(
new NetworkResponse(entry.data, entry.responseHeaders));
mDelivery.postResponse(request,response);
NetworkDispatcher.java
run()方法中,
网络请求返回结果,并转化成Response对象后,
Response<?> response =request.parseNetworkResponse(networkResponse);
if(request.shouldCache()&&response.cacheEntity != null){
mCache.put(request.getCacheKey(),response.cacheEntity);
}
mDelivery.postResponse(request,response);
另外,看一下request.getCacheKey()方法:public String getCacheKey() {
return mMethod + ":" + mUrl;
}public Request(int method, String url, Response.ErrorListener listener) {
mMethod = method;
mUrl = url;
mIdentifier = createIdentifier(method, url);
mErrorListener = listener;
setRetryPolicy(new DefaultRetryPolicy());
… …
}
Volley.java
newRequestQueue(){
stack = new HurlStack();
NetWorknetwork = new BasicNetWork(stack);
RequestQueuequeue = new RequesetQueue(network);
queue.start();
}
RequestQueue.java
public RequestQueue(NetWork network){
this(network,newExecutorDelivery());
}
start(){
mCacheDispatcher = newCacheDispatcher(mCacheQueue, mNetworkQueue, mCache, mDelivery);
mCacheDispatcher.start();
for (int i = 0; i < 4; i++) {
NetworkDispatchernetworkDispatcher = new NetworkDispatcher(
mNetworkQueue,mNetwork, mCache, mDelivery);
mDispatchers[i]= networkDispatcher;
networkDispatcher.start();
}
}
add(Request request){
mNetworkQueue.add(request);
}
NetworkDispatcher.java
extends Thread
run(){
while(true){
Request request =mNetworkQueue.take();
NetWorkResponse networkResponse= mNetwork.performRequest(request);
Response response =request.parseNetworkResponse(networkResponse);
mDelivery.postResponse(request,response);
catch:
mDelivery.postError(request,newVolleyError(e));
}
}
ExecutorDelivery.java
Executor mResponsePoster;
postResponse(Request request,Response response){
mResponsePoster.execute(runnable);
}
postError(Request request){
mResponsePoster.execute(runnable);
}
runnable:
run(){
mRequest.deliverResponse(response.result);
mRequest.deliverError(response.error);
}
Request.java
deliverResponse(){
Response.Listener mListener;
mListener.onResponse(response);
}
deliverError(){
Response.ErrorListener mErrorListener;
mErrorListener.onErrorResponse(error);
}
BasicNetWork.java
performRequest(Request request){
HttpResponse response= mHttpStack.performRequest(request);
Byte[]responseContents = entityToBytes(response.getEntity());
return newNetWorkResponse(responseContents);
}
HurlStack.java
performRequest(Request request){
HttpUrlConnectionconnection…
。。。
inputStream =connection.getInputStream();
response.setEntity(inputStream);
return response;
}
接口缓存:
Volley.java
初始化requestQueue时,
requestQueue = new RequestQueue(new DiskBasedCache(cacheDir),network);
RequestQueue.java
start()方法中初始化Dispatcher时,
mCacheDispatcher = new CacheDispatcher(mCacheQueue,mNetworkQueue, mCache, mDelivery);
networkDispatcher = new NetworkDispatcher(mNetworkQueue,mNetwork, mCache, mDelivery);
CacheDispatcher.java
run()方法中,
Cache.Entry entry =mCache.get(request.getCacheKey());
if(entry==null){
mNetworkQueue.put(request);
continue;
}
if(entry.isExpired()){
mNetworkQueue.put(request);
continue;
}
Response response = request.parseNetwordResponse(
new NetworkResponse(entry.data, entry.responseHeaders));
mDelivery.postResponse(request,response);
NetworkDispatcher.java
run()方法中,
网络请求返回结果,并转化成Response对象后,
Response<?> response =request.parseNetworkResponse(networkResponse);
if(request.shouldCache()&&response.cacheEntity != null){
mCache.put(request.getCacheKey(),response.cacheEntity);
}
mDelivery.postResponse(request,response);
另外,看一下request.getCacheKey()方法:public String getCacheKey() {
return mMethod + ":" + mUrl;
}public Request(int method, String url, Response.ErrorListener listener) {
mMethod = method;
mUrl = url;
mIdentifier = createIdentifier(method, url);
mErrorListener = listener;
setRetryPolicy(new DefaultRetryPolicy());
… …
}
相关文章推荐
- 关于高通AR在Android手机上摄像头对焦的问题
- 数据结构与算法简记:选择排序
- 一步一步教你写股票走势图——K线图五(高亮联动二)
- java中HashMap详解
- Synchronized(二)------单例模式
- DBMS_ROWID定位数据行物理存储位置
- 商战最近上市公司之争
- Windows修改注册表按键映射
- 3.7下拉控件
- C语言二维数组的本质
- XlistView的上拉刷新————下拉加载
- Linux命令对应的全称解释
- 和为S的连续正数序列
- hibernate常用API详解
- twsited(4)--不同模块用redis共享以及用web发送数据到tcpserver
- 一些IT技术网站收藏
- Ecshop一些文档
- BLOCK
- Python的多线程/多进程
- JavaScript笔记整理——驯服线程和定时器