2.RequestQueueNetworkDispatcher

参考链接:

%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90

使用Volley很简单,过程分为两步:

1.建立请求队列RequestQueue queue = new Volley.newRequestQueue()

2.新建请求XXRequest,然后将请求加入队列queue中:queue.add(XXRequest);

一、Volley.newRequestQueue()

新建queue之后只要将各类请求放入该队列即可,系统会自动对其进行处理。现在先看一下Volley.newRequestQueue做了些什么:

public static RequestQueue newRequestQueue(Context context, HttpStack stack) {File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);String userAgent = "volley/0";try {String packageName = context.getPackageName();PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);userAgent = packageName + "/" + info.versionCode;} catch (NameNotFoundException e) {}if (stack == null) {if (Build.VERSION.SDK_INT >= 9) {stack = new HurlStack();} else {// Prior to Gingerbread, HttpUrlConnection was unreliable.// See: stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));}}Network network = new BasicNetwork(stack);RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);queue.start();return queue;}

该函数中的核心代码为:

RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);queue.start();

newRequestQueue中的两个参数分别用于处理缓存请求和网络请求。这个一会再讲。先看后面一句~queue.start();

public void start() {stop(); // Make sure any currently running dispatchers are stopped.// Create the cache dispatcher and start it.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();}}

从代码中可看到,queue.start()的执行开启了其中的mCacheDispatcher和networkDispatcher,也就是负责处理Cache请求及Network请求的线程。

综上,Volley.newRequestQueue新建了一个请求队列,并开启了处理缓存请求的线程mCacheDispatcher和处理网络请求的线程networkDispatcher。

二、NetworkDispatcher& CacheDispatcher

NetworkDispatcher用于处理网络请求。其构造函数为:

public NetworkDispatcher(BlockingQueue<Request> queue,Network network, Cache cache,ResponseDelivery delivery) {mQueue = queue;mNetwork = network;mCache = cache;mDelivery = delivery;}

现在再回过头看RequestQueue的start函数,其中有~RequestQueue.java/start():

NetworkDispatchernetworkDispatcher = new NetworkDispatcher(mNetworkQueue, mNetwork,mCache,mDelivery);

这里的mNetworkQueue 是RequestQueue中定义&分配的~RequestQueue.java:

private final PriorityBlockingQueue<Request> mNetworkQueue =new PriorityBlockingQueue<Request>();

这个由Request组成的BlockingQueue用于存放网络Request。(RequestQueue中还声明&定义了一个mCacheQueue,和mNetworkQueue类似,用于存放缓存请求)

现在看下NetworkDispatcher的run函数中执行的功能:

public void run() {Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);Request request;while (true) {try {// Take a request from the queue.request = mQueue.take();} catch (InterruptedException e) {// We may have been interrupted because it was time to quit.if (mQuit) {return;}continue;}try {request.addMarker("network-queue-take");// If the request was cancelled already, do not perform the// network request.if (request.isCanceled()) {request.finish("network-discard-cancelled");continue;}// Tag the request (if API >= 14)if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {TrafficStats.setThreadStatsTag(request.getTrafficStatsTag());}// Perform the network request.NetworkResponse networkResponse = mNetwork.performRequest(request);request.addMarker("network-http-complete");// If the server returned 304 AND we delivered a response already,// we're done — don't deliver a second identical response.if (networkResponse.notModified && request.hasHadResponseDelivered()) {request.finish("not-modified");continue;}// Parse the response here on the worker thread.Response<?> response = request.parseNetworkResponse(networkResponse);request.addMarker("network-parse-complete");// Write to cache if applicable.// TODO: Only update cache metadata instead of entire record for 304s.if (request.shouldCache() && response.cacheEntry != null) {mCache.put(request.getCacheKey(), response.cacheEntry);request.addMarker("network-cache-written");}// Post the response back.request.markDelivered();mDelivery.postResponse(request, response);} catch (VolleyError volleyError) {parseAndDeliverNetworkError(request, volleyError);} catch (Exception e) {VolleyLog.e(e, "Unhandled exception %s", e.toString());mDelivery.postError(request, new VolleyError(e));}}}用最多的梦面对未来

2.RequestQueueNetworkDispatcher

相关文章:

你感兴趣的文章:

标签云: