zoukankan      html  css  js  c++  java
  • volley7--NetworkDispatcher从网络中获取数据

    源码:

      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.volley;
     18 
     19 import android.annotation.TargetApi;
     20 import android.net.TrafficStats;
     21 import android.os.Build;
     22 import android.os.Process;
     23 import android.os.SystemClock;
     24 
     25 import java.util.concurrent.BlockingQueue;
     26 
     27 /**
     28  * Provides a thread for performing network dispatch from a queue of requests.
     29  *
     30  * Requests added to the specified queue are processed from the network via a
     31  * specified {@link Network} interface. Responses are committed to cache, if
     32  * eligible, using a specified {@link Cache} interface. Valid responses and
     33  * errors are posted back to the caller via a {@link ResponseDelivery}.
     34  */
     35 public class NetworkDispatcher extends Thread {
     36     /** The queue of requests to service. */
     37     private final BlockingQueue<Request<?>> mQueue;
     38     /** The network interface for processing requests. */
     39     private final Network mNetwork;
     40     /** The cache to write to. */
     41     private final Cache mCache;
     42     /** For posting responses and errors. */
     43     private final ResponseDelivery mDelivery;
     44     /** Used for telling us to die. */
     45     private volatile boolean mQuit = false;
     46 
     47     /**
     48      * Creates a new network dispatcher thread.  You must call {@link #start()}
     49      * in order to begin processing.
     50      *
     51      * @param queue Queue of incoming requests for triage
     52      * @param network Network interface to use for performing requests
     53      * @param cache Cache interface to use for writing responses to cache
     54      * @param delivery Delivery interface to use for posting responses
     55      */
     56     public NetworkDispatcher(BlockingQueue<Request<?>> queue,
     57             Network network, Cache cache,
     58             ResponseDelivery delivery) {
     59         mQueue = queue;
     60         mNetwork = network;
     61         mCache = cache;
     62         mDelivery = delivery;
     63     }
     64 
     65     /**
     66      * Forces this dispatcher to quit immediately.  If any requests are still in
     67      * the queue, they are not guaranteed to be processed.
     68      */
     69     public void quit() {
     70         mQuit = true;
     71         interrupt();
     72     }
     73 
     74     @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
     75     private void addTrafficStatsTag(Request<?> request) {
     76         // Tag the request (if API >= 14)
     77         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
     78             TrafficStats.setThreadStatsTag(request.getTrafficStatsTag());
     79         }
     80     }
     81 
     82     @Override
     83     public void run() {
     84         Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
     85         Request<?> request;
     86         while (true) {
     87             long startTimeMs = SystemClock.elapsedRealtime();
     88             // release previous request object to avoid leaking request object when mQueue is drained.
     89             request = null;
     90             try {
     91                 // Take a request from the queue.
     92                 request = mQueue.take();
     93             } catch (InterruptedException e) {
     94                 // We may have been interrupted because it was time to quit.
     95                 if (mQuit) {
     96                     return;
     97                 }
     98                 continue;
     99             }
    100 
    101             try {
    102                 request.addMarker("network-queue-take");
    103 
    104                 // If the request was cancelled already, do not perform the
    105                 // network request.
    106                 if (request.isCanceled()) {
    107                     request.finish("network-discard-cancelled");
    108                     continue;
    109                 }
    110 
    111                 addTrafficStatsTag(request);
    112 
    113                 // Perform the network request.
    114                 NetworkResponse networkResponse = mNetwork.performRequest(request);
    115                 request.addMarker("network-http-complete");
    116 
    117                 // If the server returned 304 AND we delivered a response already,
    118                 // we're done -- don't deliver a second identical response.
    119                 if (networkResponse.notModified && request.hasHadResponseDelivered()) {
    120                     request.finish("not-modified");
    121                     continue;
    122                 }
    123 
    124                 // Parse the response here on the worker thread.
    125                 Response<?> response = request.parseNetworkResponse(networkResponse);
    126                 request.addMarker("network-parse-complete");
    127 
    128                 // Write to cache if applicable.
    129                 // TODO: Only update cache metadata instead of entire record for 304s.
    130                 if (request.shouldCache() && response.cacheEntry != null) {
    131                     mCache.put(request.getCacheKey(), response.cacheEntry);
    132                     request.addMarker("network-cache-written");
    133                 }
    134 
    135                 // Post the response back.
    136                 request.markDelivered();
    137                 mDelivery.postResponse(request, response);
    138             } catch (VolleyError volleyError) {
    139                 volleyError.setNetworkTimeMs(SystemClock.elapsedRealtime() - startTimeMs);
    140                 parseAndDeliverNetworkError(request, volleyError);
    141             } catch (Exception e) {
    142                 VolleyLog.e(e, "Unhandled exception %s", e.toString());
    143                 VolleyError volleyError = new VolleyError(e);
    144                 volleyError.setNetworkTimeMs(SystemClock.elapsedRealtime() - startTimeMs);
    145                 mDelivery.postError(request, volleyError);
    146             }
    147         }
    148     }
    149 
    150     private void parseAndDeliverNetworkError(Request<?> request, VolleyError error) {
    151         error = request.parseNetworkError(error);
    152         mDelivery.postError(request, error);
    153     }
    154 }
    NetworkDispatcher
  • 相关阅读:
    451. Sort Characters By Frequency
    424. Longest Repeating Character Replacement
    68. Text Justification
    44. Wildcard Matching
    160. Intersection of Two Linked Lists
    24. Swap Nodes in Pairs
    93. 递归实现组合型枚举
    98. 分形之城
    97. 约数之和
    96. 奇怪的汉诺塔
  • 原文地址:https://www.cnblogs.com/ganchuanpu/p/7627192.html
Copyright © 2011-2022 走看看