您的位置:首页 > 其它

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());
    … …
} 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: