Android中的volley_7_网络调度线程NetworkDispatcher
来源:互联网 发布:vb直用颜色值 编辑:程序博客网 时间:2024/06/10 08:30
demo下载:http://download.csdn.net/detail/vvzhouruifeng/8747599
NetworkDispatcher也是volley中的核心类,该类的作用就是从发送网络请求获取响应。
要知道,在定义该类的时候public class NetworkDispatcher extends Thread {} ,很明显这是一个线程。则必然有run()方法,因此从队列中获取request并执行都是在run()方法内执行的。所以在RequestQueue类中的start()方法内,有创建NetworkDispatcher并start
for (int i = 0; i < mDispatchers.length; i++) {NetworkDispatcher networkDispatcher = new NetworkDispatcher(mNetworkQueue, mNetwork, mCache, mDelivery);mDispatchers[i] = networkDispatcher;networkDispatcher.start();}
NetworkDispatcher中的四个核心的成员变量:
1.private final BlockingQueue<Request> mQueue 这是一个阻塞的队列,所有的网络请求的request都存放在该队列中,线程会一直从该队列中获取request并执行。需要注意的是,网络调度线程默认是四个的,因此四个线程要共享该请求队列。
2.private final Network mNetwork; 前面的文章已经介绍过这个类,这是执行网络请求的类,执行请求后返回可被传递的响应
3.private final Cache mCache; 缓存,网络请求拿回数据后,如果该request是可以被缓存的,那么就需要将返回的数据进行存储
4.private final ResponseDelivery mDelivery; 传递响应的类
在构造方法内需要传入这四个成员:
public NetworkDispatcher(BlockingQueue<Request> queue, Network network,Cache cache, ResponseDelivery delivery) {mQueue = queue;mNetwork = network;mCache = cache;mDelivery = delivery;}
在run方法内,有一个while(true),表示这个线程会一直开启,先从请求队列中获取request,然后执行请求,再对响应进行传递。
@Overridepublic void run() {// 设置该线程的优先级Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);// 从网络请求队列中获取的请求Request request;//会一直在网络请求队列中读取request 如果网络请求队列为空则等待while (true) {try {// Take a request from the queue.// 方法.take()是一个阻塞方法,如果网络队列中没有请求,那么会一直等待。直到获取一个请求request = mQueue.take();} catch (InterruptedException e) {// We may have been interrupted because it was time to quit.// 如果该请求被interrupt了 那么就放弃该请求,开始获取下一个请求if (mQuit) {return;}continue;}try {request.addMarker("network-queue-take");// If the request was cancelled already, do not perform the// network request. 如果该请求被取消了,那么就放弃当前请求 开始下一个请求if (request.isCanceled()) {request.finish("network-discard-cancelled");continue;}// Tag the request (if API >= 14)if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {TrafficStats.setThreadStatsTag(request.getTrafficStatsTag());}// Perform the network request. 执行网络请求后,获取到一个从网络返回的响应NetworkResponse networkResponse = mNetwork.performRequest(request);request.addMarker("network-http-complete");// If the server returned 304 AND we delivered a response// already,// we're done -- don't deliver a second identical response.// 如果响应状态码是304(304表示该次响应返回值与上次没变化,也就是说可以使用上次的响应),并且该请求已经被分发了,那么就开始下一次请求if (networkResponse.notModified&& request.hasHadResponseDelivered()) {request.finish("not-modified");continue;}// Parse the response here on the worker thread. 将响应解析出来Response<?> response = request.parseNetworkResponse(networkResponse);request.addMarker("network-parse-complete");// Write to cache if applicable. 如果该请求需要被缓存,并且响应数据不为空 那么就可以存到缓存中// TODO: Only update cache metadata instead of entire record for// 304s.if (request.shouldCache() && response.cacheEntry != null) {mCache.put(request.getCacheKey(), response.cacheEntry);request.addMarker("network-cache-written");}// Post the response back. 标记还请求已经被分配响应了request.markDelivered();mDelivery.postResponse(request, response);} catch (VolleyError volleyError) {//如果出现错误,那就传递错误信息parseAndDeliverNetworkError(request, volleyError);} catch (Exception e) {VolleyLog.e(e, "Unhandled exception %s", e.toString());// 有异常就post errormDelivery.postError(request, new VolleyError(e));}}}
- Android中的volley_7_网络调度线程NetworkDispatcher
- Android 中的线程调度
- Android 中的线程调度
- Volley的框架解读五(网络调度NetworkDispatcher)
- Android网络框架-Volley(三) CacheDispatcher和NetworkDispatcher源码分析
- Android中的volley_8_缓存调度线程CacheDispatcher
- Android 中的线程是如何调度
- Android nice在进程与线程调度中的作用
- Android nice在进程与线程调度中的作用
- Android线程调度机制
- Android线程调度机制
- 线程中中的调度图
- OpenMP 中的线程任务调度
- Android 线程池 工作调度
- volley源码解析(五)--NetworkDispatcher从网络中获取数据
- JavaScript中的线程和CPU的调度
- 读书笔记-java网络编程-3线程-线程调度
- Android Rxjava学习三----线程调度
- 各种语言取整
- JDK安装与配置环境变量
- Checkout conflict with files. How do I proceed?
- linux程序设计——文件操作(第三章)
- angularjs 定义指令学习1
- Android中的volley_7_网络调度线程NetworkDispatcher
- jquery整理
- iOS键盘弹出 视图向上滚动键盘高度
- iOS中cell的属性设置
- 关于Eclipse的SVN插件(Subclipse)历史版本乱码的问题
- 页面截图并存手机相册
- SVProgressHUD 用法
- 谈谈我了解的那些在线it学习网站
- div垂直居中的N种方法 单行/多行文字(未知高度/固定高度)