博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
volley7--NetworkDispatcher从网络中获取数据
阅读量:6709 次
发布时间:2019-06-25

本文共 6638 字,大约阅读时间需要 22 分钟。

源码:

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
> 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
> 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 the105 // 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://www.cnblogs.com/ganchuanpu/p/7627192.html

你可能感兴趣的文章
1005. 继续(3n+1)猜想 (25)
查看>>
使用POI循环写入数据时发现只有最后一列有数据
查看>>
Animation(四)
查看>>
USB转串口驱动安装及注意事项
查看>>
vue 中的computed和watch
查看>>
Delphi窗体显示Echarts图表
查看>>
使用模板时 error LNK2019: 无法解析的外部符号
查看>>
第四十六课、查找对话框的功能实现------------------狄泰软件学院
查看>>
在平台中使用JNDI 数据源
查看>>
Android中Listview实现分页加载效果OnScrollListener
查看>>
linux学习笔记
查看>>
js中获取数组中的最大值最小值
查看>>
R基础函数操作
查看>>
在linux中添加ftp用户,并设置相应的权限
查看>>
MySQL 5.1中文参考手册 - 学习笔记
查看>>
树莓派入手,相关设置以及使用迅雷远程下载
查看>>
IOS Note - Outlet(插座) & Action(动作)
查看>>
Redis命令
查看>>
Android 时间和日期的 widget 模拟时钟和数字时钟
查看>>
-webkit新属性 image-set和srcset
查看>>