请求队列 RequestQueue
每一个使用过Volley的同行们都用过 RequestQueue.add(request) 这个方法,看看这个方法到底做了什么:
public <T> Request<T> add(Request<T> request) {
// Tag the request as belonging to this queue and add it to the set of current requests.
request.setRequestQueue(this);
synchronized (mCurrentRequests) {
mCurrentRequests.add(request);
}
// Process requests in the order they are added.
request.setSequence(getSequenceNumber());
request.addMarker("add-to-queue");
// If the request is uncacheable, skip the cache queue and go straight to the network.
if (!request.shouldCache()) {
mNetworkQueue.add(request);
return request;
}
// Insert request into stage if there's already a request with the same cache key in flight.
synchronized (mWaitingRequests) {
String cacheKey = request.getCacheKey();
if (mWaitingRequests.containsKey(cacheKey)) {
// There is already a request in flight. Queue up.
Queue<Request<?>> stagedRequests = mWaitingRequests.get(cacheKey);
if (stagedRequests == null) {
stagedRequests = new LinkedList<Request<?>>();
}
stagedRequests.add(request);
mWaitingRequests.put(cacheKey, stagedRequests);
if (VolleyLog.DEBUG) {
VolleyLog.v("Request for cacheKey=%s is in flight, putting on hold.", cacheKey);
}
} else {
// Insert 'null' queue for this cacheKey, indicating there is now a request in
// flight.
mWaitingRequests.put(cacheKey, null);
mCacheQueue.add(request);
}
return request;
}
}
我们看到 这里面有两个被用synchronized 块锁住的对象:mCurrentRequests,mWaitingRequests
那么这两个是什么呢?
/**
* The set of all requests currently being processed by this RequestQueue. A Request
* will be in this set if it is waiting in any queue or currently being processed by
* any dispatcher.
*/
private final Set<Request<?>> mCurrentRequests = new HashSet<Request<?>>();
/**
* Staging area for requests that already have a duplicate request in flight.
*
*
* <li>containsKey(cacheKey) indicates that there is a request in flight for the given cache
* key.</li>
* <li>get(cacheKey) returns waiting requests for the given cache key. The in flight request
* is not contained in that list. Is null if no requests are staged.</li>
*
*/
private final Map<String, Queue<Request<?>>> mWaitingRequests =
new HashMap<String, Queue<Request<?>>>();
看英文注释意思:
mCurrentRequests 大意是,当前在这个队列里所有正在被执行的请求的集合。所有的正在被执行的 或者 在队列中等待执行的请求都应该放进这个set 集合中。
mWaitingRequests:包含重复请求的临时区域,
通俗的说就是 一个是所有正在执行和等待执行的请求集合,另一个是存放重复请求的临时区域 是一个map.
当我们调用add 方法的时候 首先是把请求 加入到 mCurrentRequests 中,当然咯,这个过程是同步的。
此时volley 还给每个请求设置了 序号 和 备注:
request.setSequence(getSequenceNumber());
request.addMarker("add-to-queue");
接下来如下:
if (!request.shouldCache()) {
mNetworkQueue.add(request);
return request;
}
这段代码很有意思,如果一个请求不支持被缓存的话,马上就把这个请求交给mNetworkQueue
中去执行,后面的代码不再执行。
mNetworkQueue 的定义如下:
/** The queue of requests that are actually going out to the network. */
private final PriorityBlockingQueue<Request<?>> mNetworkQueue =
new PriorityBlockingQueue<Request<?>>();
这是一个全新的阻塞式的队列。这个队列的作用 后面再讲。
在Request 类中 我们看到
private boolean mShouldCache = true;
说明 Volley中默认每一个请求都是要被缓存的。
接下来 通过Request的cacheKey 区分请求是否重复,如果有重复请求,就把这个请求所属的队列拿出来,然后把新的请求加到队列中,再存到 mWaitingRequests中。
如果mWaitingRequests中没有这个请求,就用这个请求的 cacheKey 去保存一个NULL值,
言简意赅的说;每一个请求都会在执行的同时放到 mWaitingRequests中 ,同时也要被放进缓存队列中,
mCacheQueue:
private final PriorityBlockingQueue<Request<?>> mCacheQueue =
new PriorityBlockingQueue<Request<?>>();
mCacheQueue 中的请求何时执行,后面会讲到。
下一节 Volley 的任务调度模型
http://f303153041.iteye.com/blog/2281352
分享到:
相关推荐
Volley源码解析是理解其工作原理、优化网络请求的关键,下面我们将深入探讨Volley的核心组件、工作流程以及关键算法。 首先,Volley的核心组件包括RequestQueue、Network、Cache和ResponseDelivery。RequestQueue是...
在压缩包中的"Volley.jar"是Volley库的编译结果,可以直接导入到Android项目中使用,无需解析源码。使用jar包时,开发者可以直接调用Volley提供的API,如`RequestQueue.add(Request)`来添加请求,或者使用`...
这个"volley框架源码实例"包含了Volley的源代码和一些二次封装的示例,你可以通过下载并导入到你的工程中运行,以便更深入地理解和学习Volley的工作原理和用法。 首先,Volley的核心特点包括: 1. **缓存机制**:...
这个压缩包中包含的应该是Google官方发布的最新版本的Volley源码,这对于开发者深入理解Volley的工作原理、进行二次开发或者优化自己的应用网络请求性能具有非常高的价值。 Volley的核心特点包括: 1. **高效缓存*...
在深入了解Volley的源码之前,我们先来概述一下Volley的基本概念和核心功能。 Volley的主要目标是简化Android应用中的网络请求处理,提供了一套高效的网络请求管理机制,包括异步处理、缓存策略、错误处理和性能...
Volley的核心设计理念是优化UI线程的性能,减少网络延迟对用户界面的影响,以及通过缓存机制提高用户体验。下面我们将深入探讨Volley的源码,了解其工作原理和主要功能。 1. **网络请求模块**: - `Request`类是...
Volley的核心特性包括: 1. **缓存策略**: - Volley提供了基于内存和磁盘的两级缓存机制,能够快速响应网络请求,减少对服务器的压力。内存缓存用于存储最近访问的数据,磁盘缓存则用于长期存储,即使应用关闭也...
Volley 的核心优势在于其对网络请求的优化、内存管理以及线程调度策略。 1. **RequestQueue**:这是 Volley 的主要入口点,负责管理多个 CacheDispatcher 和 NetworkDispatcher 线程,处理请求队列。RequestQueue ...
在Volley的源码中,可以看到许多关键类的设计,如Request类用于封装网络请求信息,ResponseListener接口用于处理响应数据,Parser类用于解析数据等。此外,Volley还提供了强大的错误处理机制,使得开发者可以方便地...
Volley的核心理念是优化内存使用,减少网络请求的延迟,以及通过缓存机制提高用户体验。这个名为"可查看Volley源码"的压缩包文件,很显然是为了帮助开发者深入理解Volley的工作原理,从而更好地利用它进行应用开发。...
Volley是Google推出的一款高效的网络请求库,专为Android平台设计。...通过深入理解Volley的源码,开发者可以更好地利用其特性,提升应用的网络性能。提供的文档将帮助你理解和应用这些知识点,解决实际开发中的问题。
在"Volley.jar及源码"的资源中,我们得到了1.0.19版本的Volley库的二进制形式(volley_library-1.0.19.jar)以及源码(android-volley-master.zip)。通过分析这些内容,我们可以深入了解Volley的工作原理和使用方法...
- 数据解析:Volley支持多种数据格式,如JSON、XML,可以直接转换为Java对象。 - 取消请求:可以轻松取消不再需要的请求,避免资源浪费。 2. OkHttp是Square公司开发的一个高效的HTTP客户端,其设计理念是减少...
Volley框架的源码分析可以帮助开发者深入理解其工作原理,从而更好地优化网络请求性能,例如调整缓存策略、定制网络栈或实现自定义的解析器。通过对源码的学习,开发者还可以解决Volley在特定场景下可能遇到的问题,...
其次,Volley支持多种网络请求类型,如GET、POST等,并且能够自动处理JSON和其他常见格式的数据解析,简化了开发过程。 在压缩包中的"android-volley-master"目录下,包含的是Volley的源码。通过对源码的学习,...