Android中的volley_7_网络调度线程NetworkDispatcher


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,然后执行请求,再对响应进行传递。

@Override
	public 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 error
				mDelivery.postError(request, new VolleyError(e));
			}
		}
	}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值