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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • webpack异步加载_webpack配置按需加载

    webpack异步加载_webpack配置按需加载异步一定有一个回调函数 1、实现js和html分离 2、js脚本中执行postMessage,回调函数才会生效 3、回调函数的参数为一个对象,对象的data属性是js脚本中postMessage的参数 使用步骤 new对象=newWorker(‘异步执行的js文件路径’); 对象.onmessage=function(回调对象){通过对象.data调用postMessage返…

    2022年10月22日
  • 圣杯布局的原理

    圣杯布局的原理圣杯布局的起源InSearchoftheHolyGrail圣杯布局解决的问题两边定宽,中间自适应的三栏布局,中间栏要放在文档流前面以优先渲染。圣杯布局的原理HTML代码<divclass="content"><divclass="centercol"></div><divclass="leftcol"></div>

    2022年6月28日
  • Bootstrap-tagsinput标系统使用心得

    Bootstrap-tagsinput标系统使用心得

    2021年11月5日
  • ui bug_行为测试

    ui bug_行为测试在大多数开发、测试眼中,UI测试的重要性远小于功能测试、性能测试等,但只要够细心,总能发现一些UIbug或者UI可以改进的地方提高用户体验。录入界面  1.1输入字段要完整,且要与列表字段相符合(参照数据库进行检查)  1.2必填项一律在后面用*表示(必填项为空在处理之前要有相关的提示信息)  1.3字段需要做校验,如果校验不对需要在处理之前要有相关的

    2022年10月30日
  • Ubuntu jsp平台使用JDBC来连接MySQL数据库

    Ubuntu jsp平台使用JDBC来连接MySQL数据库

    2021年8月31日
  • 【已解决】【V1.0版本】如何彻底关闭Win10的自动更新并且随时可以恢复?

    【已解决】【V1.0版本】如何彻底关闭Win10的自动更新并且随时可以恢复?更新失败的问题我已经参考这篇文章解决了:【亲测管用】Windows10无法完成更新,正在撤销更改怎么办?精简脚本,在不删除服务的情况下阻止自动更新:【亲测管用】如何使用脚本关闭Win10自动更新服务并阻止其自动启动?如何关闭Windows10的自动更新真的是个大难题.当你遇到Windows更新包安装失败,却又被强制每天重新安装并且失败(安装失败有的时候得重启好几次),望着一遍又一…

    2022年6月4日

发表回复

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

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