当前位置:网站首页>Volley7 – networkdispatcher obtains data from the network [easy to understand]
Volley7 – networkdispatcher obtains data from the network [easy to understand]
2022-07-25 00:42:00 【Full stack programmer webmaster】
Hello everyone , I meet you again , I'm the king of the whole stack .
Source code :
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
Publisher : Full stack programmer stack length , Reprint please indicate the source :https://javaforall.cn/108121.html Link to the original text :https://javaforall.cn
边栏推荐
- 软考 --- 程序设计语言基础(下)
- 自动化测试系列-Selenium三种等待详解
- 2012.4.13 360 written examination summary
- Automated test series selenium three kinds of waiting for detailed explanation
- [英雄星球七月集训LeetCode解题日报] 第24日 线段树
- R language uses ISNA function to check whether the list and dataframe contain missing values, marks abnormal values in data columns in dataframe as missing values Na, and uses na.omit function to dele
- Unity slider slider development
- Solution to the shortest Hamilton path problem
- [untitled]
- Daily question 1 · 1260. Two dimensional network migration · simulation
猜你喜欢

BGP机房和BGP

Dpdk based basic knowledge sorting-01

【无标题】

The new version of Alibaba Seata finally solves the idempotence, suspension and empty rollback problems of TCC mode

WPF implements RichTextBox keyword query highlighting

Implement a avatar looping control
![[untitled]](/img/70/5db8a8df63a3fd593acf7f69640698.png)
[untitled]

痛并快乐的-NIO编程

Which automation tools can double the operation efficiency of e-commerce?

Invitation letter | "people, finance, tax" digital empowerment, vigorously promote retail enterprises to achieve "doubling" of economies of scale
随机推荐
在混合云中管理数据库:八个关键注意事项
Principle of data proxy
LeetCode_ 392_ Judgement subsequence
Simple use of mongodb database
Server intranet and Extranet
Promtool Check
Daily question 1 · 1260. Two dimensional network migration · simulation
2022 Henan Mengxin League game (2): Henan University of technology d-pair
360 interview summary 2013 campus recruitment 2012-4-4
unresolved external symbol [email protected] resolvent
2012.4.13 360 written examination summary
Quartus: install cyclone 10 LP device library for quartus version 17.1
启牛商学院靠谱吗?讲课老师推荐开华泰账户安全吗
[untitled]
[acwing weekly rematch] 61st weekly 20220723
进程的几种状态
Educational codeforces round 89 (rated for Div. 2) ABC problem solution
Kubernetes application design guide
Log4j configuration file
UXDB在不知道明文密码的情况下重置密码