您的位置:首页 > 理论基础 > 计算机网络

android网络框架volley学习之RequestQueue类

2015-03-31 19:04 399 查看
通过Volley类创建了RequestQueue对象,同时在创建之后调用了它的start()方法。作为请求体存放的地方,当然有必要分析下这个类。

分析RequestQueue类就必不可少的先得介绍一下此类中包装的四个队列:



这四个集合类构成了支撑RequestQueue的分类处理不同请求的基础。具体的体现在RequestQueue的add()方法。
//向请求队列中添加请求
public Request add(Request request) {

request.setRequestQueue(this);

//先给要操作的对象上锁   防止因多线程操作出现安全问题
synchronized (mCurrentRequests) {

//向当前的请求队列添加请求
mCurrentRequests.add(request);
}

//对加入队列中的请求进行一系列的设置
request.setSequence(getSequenceNumber());
request.addMarker("add-to-queue");

//如果当前的请求不需要缓存则跳过本地缓存队列,直接添加到网络请求队列
if (!request.shouldCache()) {
mNetworkQueue.add(request);
return request;
}

//给mWaitingRequests上锁 同样存在线程安全问题
synchronized (mWaitingRequests) {

//调用请求的cacheKey值  实际上返回的是请求的URL地址
String cacheKey = request.getCacheKey();

//判断目前等待请求队列中是否含有此请求
if (mWaitingRequests.containsKey(cacheKey)) {

//如果存在则取出map中的queue对象
Queue<Request> stagedRequests = mWaitingRequests.get(cacheKey);

//判断queue中是否存在request
if (stagedRequests == null) {

//不存在的话 就新建一个容器
stagedRequests = new LinkedList<Request>();
}

//并将当前请求添加到队列中
stagedRequests.add(request);

//重新放入map对象中
mWaitingRequests.put(cacheKey, stagedRequests);
if (VolleyLog.DEBUG) {
VolleyLog.v("Request for cacheKey=%s is in flight, putting on hold.", cacheKey);
}
} else {

//第一次请求时  则将请求放入 mWaitingRequests 同时添加到本地请求队列中
mWaitingRequests.put(cacheKey, null);
mCacheQueue.add(request);
}
return request;
}
}


流程图如下:


另外一个重要的方法就是start()方法
//开启队列请求
public void start() {
stop();
//利用缓存队列、网络请求队列、缓存类以及响应转发来构造缓存调度器,并开启线程
mCacheDispatcher = new CacheDispatcher(mCacheQueue, mNetworkQueue, mCache, mDelivery);
mCacheDispatcher.start();

//根据设置的网络调度器数组大小来循环建立网络调度器
for (int i = 0; i < mDispatchers.length; i++) {

//利用网络请求队列、网络类、缓存类以及响应转发来构建网络调度器并赋值、开启线程
NetworkDispatcher networkDispatcher = new NetworkDispatcher(mNetworkQueue, mNetwork,
mCache, mDelivery);
mDispatchers[i] = networkDispatcher;
networkDispatcher.start();
}
}

当然RequestQueue的方法不止这两个,还有对应的构造方法、取消某个请求或者某一类请求(请求过滤器)、结束所有的请求(也就是结束请求线程类)等方法,这里就不一一分析了。

不对之处请大家指正,谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: