基于Android上网络请求的重要性,也基于volley的中等逻辑难度,闲着没事,又开始对它的原理研究了起来。

首先呈上最新的Volley类结构:

Volley  cacheDir=com.hai.cacheRequestQueue//请求队列DiskBasedCache//硬盘缓存cacheDirBasicNetworkHurlStack//httpUrlConnection请求ExecutorDelivery(new Handler(Looper.getMainLooper()//执行回调Response的success和errorRequestQueueAtomicInteger mSequenceGeneratorHashMap> mWaitingRequestsHashSet mCurrentRequestsPriorityBlockingQueue mCacheQueuePriorityBlockingQueue mNetworkQueueCacheDispatcher(request调度线程)mCacheQueuemNetworkQueuemCache(DiskBasedCache)mDelivery(ExecutorDelivery)NetworkDispatcher[4] mDispatchers//4个网络分发线程mNetworkQueuemNetwork(BasicNetwork)mCache(DiskBasedCache)mDelivery(ExecutorDelivery)

说明:volley中最重要的是RequestQueue//请求队列,基于RequestQueue的成员太多,故本人对RequestQueue的成员分了两个部分。层次之间的收进表示的是父类子类的关系。如上:RequestQueue包含DiskBasedCache、BasicNetwork和ExecutorDelivery成员,DiskBasedCache包含cacheDir。

如下是分析得出的volley运行过程:

1,mCache从缓存读取所有缓存文件的CacheHeader,记录缓存文件大小2,CacheDispatcher循环从 mCacheQueue 中取走 request判断request.isCanceled()?是: mCurrentRequests.remove(request);判断request.shouldCache()是: mCacheQueue 添加包含此request的queue;否:判断DiskBasedCache是否有key为此请求的Uri的Cache.Entry?否: mNetworkQueue 添加request:是:判断Cache.Entry是否过期?是:request.setCacheEntry(过期的entry), mNetworkQueue 添加request;否:解析未过期的CacheEntry得到Response,再次判断需要刷新CacheEntry是:request.setCacheEntry(过期的entry), mNetworkQueue.put(request);否:mDelivery把结果传递到ui(Handler deliverResponse或者deliverError)3,NetworkDispatcher循环从 mNetworkQueue 中取走requestBasicNetwork执行request收集缓存Entry,为request设置headers.put("If-None-Match", entry.etag);headers.put("If-Modified-Since", DateUtils.formatDate(refTime));HurlStack执行request,connection.setUseCaches(false)connection.设置additionalHeaders和request.getHeaders()返回  BasicHttpResponse (包含headers和entity)判断httpResponse的header是否==HttpStatus.SC_NOT_MODIFIED,是:返回 NetworkResponse(HttpStatus.SC_NOT_MODIFIED,request.getCacheEntry().data, responseHeaders, true);否:返回新的NetworkResponse解析NetworkResponse得到responsemCache存取request的response(responseheader和Content)mDelivery把结果传递到ui(Handler deliverResponse或者deliverError)


如果我们写上这么一个demo:

 void testVolley(){        RequestQueue requestQueue = Volley.newRequestQueue(this);        StringRequest request=new StringRequest(Request.Method.POST, "www.baidu.com", new Response.Listener() {            @Override            public void onResponse(String s) {            }        }, new Response.ErrorListener() {            @Override            public void onErrorResponse(VolleyError volleyError) {            }        });        Request req = requestQueue.add(request);        req.toString();    }
当new StirngRequest的时候:会初始化这么些东西:

初始化一个StringRequest:Request.Method.POSTResponse.ListenerResponse.ErrorListenerDefaultRetryPolicyDEFAULT_TIMEOUT_MS = 2500;DEFAULT_MAX_RETRIES = 1;DEFAULT_BACKOFF_MULT = 1.0F;mShouldCache=true
然后当requestQueue.add(request):

StringRequest 设置当前请求队列, mCurrentRequests 添加StringRequest判断 request.shouldCache()?否: mNetworkQueue.add(request);是:mWaitingRequests是否包含cacheKey:否: mWaitingRequests 添加key=uri,value=null, mCacheQueue 添加StringRequest是: mWaitingRequests 添加key=uri,value=queue(包含request)

当添加requestQueue添加request完后,然后就是第一部分的volley运行过程了。

之所以我又更新了这篇博文,是因为volley对于网络请求的学习有着很好的借鉴意义,因此。。。,过段时间开始研究下试下流行的OkHttp。

   

附近是google官方volley源码包

http://download.csdn.net/download/u014763302/9263413

更多相关文章

  1. android中http访问总结
  2. Google I/O大会发布Android(安卓)Studio,安装与不能运行解决等错
  3. Google I/O大会发布Android(安卓)Studio,安装与不能运行解决
  4. Android中判断Intent是否存在的方法
  5. Android(安卓)的网络编程
  6. Android(安卓)使用HTTPClient调用Web请求(查询手机号码区域)
  7. Android(安卓)- 向服务器发送数据(POST) - HTTPClient.
  8. Android开源框架源码鉴赏:Okhttp
  9. IntentService通过HandlerThread单独开启一个线程来处理所有Inte

随机推荐

  1. 今天体会最深的一点就是android的生命周
  2. Android(安卓)Studio打包全攻略
  3. android 导入项目 项目中文字乱码问题
  4. android中两个app之间广播,并且在接收者中
  5. Android(安卓)API Guides---Camera
  6. android smack源码分析——接收消息以及
  7. 支持单选,多选,还可以限制选择的数量的an
  8. Android(安卓)模拟器屏幕定制(修改控制器
  9. 作为一名Android(安卓)APP开发者的自我总
  10. 详解广播机制(借鉴郭霖老师著作)