Android volley的源码实现原理

来源:互联网 发布:itunes备份管理器软件 编辑:程序博客网 时间:2024/06/06 13:18

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

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

Volley  cacheDir=com.hai.cacheRequestQueue//请求队列DiskBasedCache//硬盘缓存cacheDirBasicNetworkHurlStack//httpUrlConnection请求ExecutorDelivery(new Handler(Looper.getMainLooper()//执行回调Response的success和errorRequestQueueAtomicInteger mSequenceGeneratorHashMap<String, Queue<Request>> mWaitingRequestsHashSet<Request> mCurrentRequestsPriorityBlockingQueue<Request> mCacheQueuePriorityBlockingQueue<Request> 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<String>() {            @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

0 0
原创粉丝点击