volley7–NetworkDispatcher从网络中获取数据[通俗易懂]

volley7–NetworkDispatcher从网络中获取数据

大家好,又见面了,我是全栈君。

源码:

volley7--NetworkDispatcher从网络中获取数据[通俗易懂]
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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108121.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ScriptManager局部刷新「建议收藏」

    ScriptManager局部刷新「建议收藏」ScriptManager和UpdatePanel控件联合使用可以实现页面异步局部更新的效果。其中的UpdatePanel就是设置页面中异步局部更新区域,它必须依赖于ScriptManager存在,因为ScriptManger控件提供了客户端脚本生成与管理UpdatePanel的功能。几个重要的属性:ScriptManager控件的EnablePartialRendering属性:true…

    2022年7月13日
    19
  • Linux的vi命令用法大全_linux top命令详解

    Linux的vi命令用法大全_linux top命令详解vi共分为三种模式:分别是一般模式,编辑模式与命令行模式一般模式:以vi打开一个文件就直接了一般模式(这是默认的模式)编辑模式:在指令模式下输入的按键“i,I,o,O,a,A,r,R”,vi即认为是在当前位置插入字符。而在输入模式下,vi则把输入的按键当作插入的字符来处理。指令模式切换到输入模式只需键入相应的输入命令即可(如a,A),而要从输入模式切换到指令模式,则需在输入模式下键入…

    2022年9月22日
    5
  • WEB项目不支持Linq的解决「建议收藏」

    WEB项目不支持Linq的解决

    2022年3月8日
    184
  • Stata: 合成控制法 synth 命令无法加载 plugin 的解决办法

    Stata: 合成控制法 synth 命令无法加载 plugin 的解决办法 作者:陈勇吏(上海交通大学安泰经济与管理学院) Stata连享会:知乎|简书|码云|CSDNStata连享会 计量专题||精品课程||简书推文||公众号合集 连享会#金秋十月@空间计量专题(2019.10.24-27,成都)连享会:内生性问题及估计方法专题 合成控制法的常用命令synth在使用过程中,可能会出…

    2022年5月1日
    83
  • 直接加QQ好友的链接或会话的方法

    出自本博客:qq_2300688967原文链接:https://blog.csdn.net/qq_2300688967/article/details/52162230下面是两种方法,一种直接会话,一种添加好友,只需将本人的QQ改成自己的就行了(1)下面这个代码,可直接临时会话tencent://message/?Menu=yes&amp;uin=2300688967&amp;…

    2022年4月9日
    130
  • RewriteRule指令[通俗易懂]

    RewriteRule指令[通俗易懂]作为RewriteRule指令的第三个参数。Flags是一个包含以逗号分隔的下列标记的列表: ‘last|L'(最后一个规则last)立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记可以阻止当前已被重写的URL为其后继的规则所重写。举例,使用它可以重写根路径的URL(‘/’)为实际存在的URL,比如,’/e/w

    2022年5月14日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号