android网络框架volley学习之RequestQueue类
2015-03-31 19:04
399 查看
通过Volley类创建了RequestQueue对象,同时在创建之后调用了它的start()方法。作为请求体存放的地方,当然有必要分析下这个类。
分析RequestQueue类就必不可少的先得介绍一下此类中包装的四个队列:
这四个集合类构成了支撑RequestQueue的分类处理不同请求的基础。具体的体现在RequestQueue的add()方法。
流程图如下:
另外一个重要的方法就是start()方法
当然RequestQueue的方法不止这两个,还有对应的构造方法、取消某个请求或者某一类请求(请求过滤器)、结束所有的请求(也就是结束请求线程类)等方法,这里就不一一分析了。
不对之处请大家指正,谢谢!
分析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的方法不止这两个,还有对应的构造方法、取消某个请求或者某一类请求(请求过滤器)、结束所有的请求(也就是结束请求线程类)等方法,这里就不一一分析了。
不对之处请大家指正,谢谢!
相关文章推荐
- Android学习记录之Volley网络通信框架基础解析(1)
- Android学习记录20171023--Volley网络框架(一)
- Android网络框架volley学习(八)缓存Cache简析
- Android网络框架volley学习(六)调度器CacheDispatcher简析
- android网络请求框架的学习之路——浅谈对Volley,OkHttp,Retrofit的了解与对比
- Android网络框架volley学习(十一)volley源码解析总结
- 关于android Volley网络通信框架的学习
- android学习之volley框架(网络)
- Android网络框架volley学习(二)工作流程分析
- android网络框架volley学习之HttpStack接口
- android网络请求框架的学习之路——浅谈对Volley,OkHttp,Retrofit的了解与对比
- Android网络框架volley学习(一)基本用法
- android网络请求框架的学习之路——浅谈对Volley,OkHttp,Retrofit的了解与对比 标签: androidVolleyOkhttpRetrofit网络请求框架
- Android网络通信框架Volley的学习笔记
- Android网络框架volley学习(九)请求结果Response<T>简析
- Android网络框架volley学习(五)请求队列RequestQueue简析
- android Volley网络通信框架学习
- Android中Http网络请求库框架Volley和Asnyc-http的使用---第三方库学习笔记(一)
- android网络框架volley学习之Volley类
- Android网络框架volley学习(十)分发结果ResponseDelivery简析