Android volleyのソースコード実現原理
Android上のネットワークリクエストの重要性に基づいて、volleyの中程度の論理的難易度にも基づいて、暇で大丈夫で、またその原理を研究し始めました.
まず、最新のVolleyクラス構造を示します.
説明:volleyで最も重要なのはRequestQueue//リクエストキューであり、RequestQueueに基づくメンバーが多すぎるため、本人はRequestQueueのメンバーに2つの部分を分けた.階層間の受入は、親サブクラスの関係を表します.上記のように、RequestQueueにはDiskBasedCache、BasicNetwork、およびExecutorDeliveryメンバーが含まれ、DiskBasedCacheにはcacheDirが含まれます.
分析したvolleyの実行手順は、次のとおりです.
もし私たちがこのようなdemoを書いたら:
requestQueueの追加requestの追加が完了すると、最初のvolley実行プロセスが実行されます.
私がまたこのブログを更新したのは、volleyがネットリクエストの勉強に良い参考になったからです...しばらくして流行のOkHttpを研究し始めた.
近くはgoogle公式volleyソースパッケージ
http://download.csdn.net/download/u014763302/9263413
まず、最新の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