Android volleyのソースコード実現原理


Android上のネットワークリクエストの重要性に基づいて、volleyの中程度の論理的難易度にも基づいて、暇で大丈夫で、またその原理を研究し始めました.
まず、最新のVolleyクラス構造を示します.
Volley  
	cacheDir=com.hai.cache
	RequestQueue//    
		DiskBasedCache//    
			cacheDir
		BasicNetwork
			HurlStack//httpUrlConnection  
		ExecutorDelivery(new Handler(Looper.getMainLooper()//    Response success error
	RequestQueue
		AtomicInteger mSequenceGenerator
		HashMap> mWaitingRequests
		HashSet mCurrentRequests
		PriorityBlockingQueue mCacheQueue
		PriorityBlockingQueue mNetworkQueue
		CacheDispatcher(request    )
			mCacheQueue
			mNetworkQueue
			mCache(DiskBasedCache)
			mDelivery(ExecutorDelivery)
		NetworkDispatcher[4] mDispatchers//4       
			mNetworkQueue
			mNetwork(BasicNetwork)
			mCache(DiskBasedCache)
			mDelivery(ExecutorDelivery)

説明:volleyで最も重要なのはRequestQueue//リクエストキューであり、RequestQueueに基づくメンバーが多すぎるため、本人はRequestQueueのメンバーに2つの部分を分けた.階層間の受入は、親サブクラスの関係を表します.上記のように、RequestQueueにはDiskBasedCache、BasicNetwork、およびExecutorDeliveryメンバーが含まれ、DiskBasedCacheにはcacheDirが含まれます.
分析したvolleyの実行手順は、次のとおりです.
1,mCache            CacheHeader,        
2,CacheDispatcher    mCacheQueue     request
	  request.isCanceled()?
		 : mCurrentRequests.remove(request);  request.shouldCache()
			 : mCacheQueue      request queue;
		 :  DiskBasedCache   key     Uri Cache.Entry?
			 : mNetworkQueue   request:
			 :  Cache.Entry    ?
				 :request.setCacheEntry(   entry), mNetworkQueue   request;
				 :      CacheEntry  Response,        CacheEntry
					 :request.setCacheEntry(   entry), mNetworkQueue.put(request);
					 :mDelivery      ui(Handler deliverResponse  deliverError)					
				
3,NetworkDispatcher    mNetworkQueue    request
	BasicNetwork  request
		    Entry, request  headers.put("If-None-Match", entry.etag);
		headers.put("If-Modified-Since", DateUtils.formatDate(refTime));
			HurlStack  request,
				connection.setUseCaches(false)
				connection.  additionalHeaders request.getHeaders()
					    BasicHttpResponse (  headers entity)
		  httpResponse header  ==HttpStatus.SC_NOT_MODIFIED,	
			 :   NetworkResponse(HttpStatus.SC_NOT_MODIFIED,
								request.getCacheEntry().data, responseHeaders, true);
			 :    NetworkResponse
	  NetworkResponse  	response	
	mCache  request response(responseheader Content)
	mDelivery      ui(Handler deliverResponse  deliverError)

もし私たちがこのようなdemoを書いたら:
 void testVolley(){
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        StringRequest request=new StringRequest(Request.Method.POST, "www.baidu.com", new Response.Listener() {
            @Override
            public void onResponse(String s) {

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {

            }
        });
        Request req = requestQueue.add(request);
        req.toString();
    }
new StirngRequestの場合:このようなものが初期化されます.
     StringRequest:
	Request.Method.POST
	Response.Listener
	Response.ErrorListener
	DefaultRetryPolicy
		DEFAULT_TIMEOUT_MS = 2500;
		DEFAULT_MAX_RETRIES = 1;
		DEFAULT_BACKOFF_MULT = 1.0F;
	mShouldCache=true
そしてrequestQueue.add(request):
StringRequest         , mCurrentRequests   StringRequest
	   request.shouldCache()?
		 : mNetworkQueue.add(request);
		 :mWaitingRequests    cacheKey:
			 : mWaitingRequests   key=uri,value=null, mCacheQueue   StringRequest
			 : mWaitingRequests   key=uri,value=queue(  request)

requestQueueの追加requestの追加が完了すると、最初のvolley実行プロセスが実行されます.
私がまたこのブログを更新したのは、volleyがネットリクエストの勉強に良い参考になったからです...しばらくして流行のOkHttpを研究し始めた.
近くはgoogle公式volleyソースパッケージ
http://download.csdn.net/download/u014763302/9263413