Android Vollay解析(一)之GET、POST请求篇

一、 Vollay 的地位

自2013年Google I/O 大会上,Google 推出 Vollay 之后,一直到至今,由于其使用简单、代码轻量、通信速度快、并发量大等特点,倍受开发者们的青睐。 先看两张图,让图片告诉我们 Vollay 的用处; 第一张 Vollay 的经典图

通过上图,我们可以发现 Vollay适合网络通信频繁操作,并能同时实现多个网络通信。 第二张图

我们在以前在 ListView 的 item 中如果有网络请求,一般都是通过Task 异步任务来完成,并在完成之后通知 Adapter 更新数据。而Vollay 不需要这么麻烦,因为里面已经为我们封装好了处理的线程,网络请求,缓存的获取,数据的回掉都是对应不同的线程。

二、Vollay使用步骤及基本分析

vollay 的使用遵循以下四步: 1、获取请求队里RequestQueue RequestQueue mRequestQueue = Vollay.newRequestQueue(Context context) ; 2、启动请求队列 mRequestQueue.start(); 以上这两步通常也归为一步 3、获取请求Request Request mRequest = new ObjectRequest(…) ; ObjectRequest需要根据自己请求返回的数据来定制,继承之抽象类Request,Vollay 已经为我们实现了 StringRequest、JsonArrayRequest、JsonObjectRequest、ImageRequest请求; 4、把请求添加到请求队列中 mRequestQueue.add(mRequest); 说明:在一个项目中,请求队列不需要出现多个,一般整个项目中共用同一个mRequestQueue,因为请求队列启动的时候会做以下事情

/*** Starts the dispatchers in this queue.*/() {//结束队列中所有的线程stop(); mCacheDispatcher = new CacheDispatcher(mCacheQueue, mNetworkQueue, mCache, mDelivery);//启动缓存线程mCacheDispatcher.start();(int i = 0; i < mDispatchers.length; i++) {NetworkDispatcher networkDispatcher = new NetworkDispatcher(mNetworkQueue, mNetwork,mCache, mDelivery);//保存网络请求线程mDispatchers[i] = networkDispatcher;//启动网络请求处理线程networkDispatcher.start();}}

启动一个缓存mCacheDispatcher线程,用来读取缓存数据,启动若干个网络请求mDispatchers线程,用来实现网络通信。 mCacheDispatcher线程的 run 方法

() {if (DEBUG) VolleyLog.v(“start new dispatcher”);Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);// Make a blocking call to initialize the cache.//初始化缓存mCache.initialize();//循环获取缓存请求while (true) {try {Request request = mCacheQueue.take();//打印 log 信息request.addMarker(“cache-queue-take”);(request.isCanceled()) {request.finish(“cache-discard-canceled”);continue;}// Attempt to retrieve this item from cache.//获取缓存数据,如果没有,把请求加入到网络请求的队列中Cache.Entry entry = mCache.get(request.getCacheKey());if (entry == null) {request.addMarker(“cache-miss”);Log.i(“CacheDispatcher”, “没有缓存数据:” + request.getUrl());mNetworkQueue.put(request);continue;}(entry.isExpired()) {request.addMarker(“cache-hit-expired”);request.setCacheEntry(entry);Log.i(“CacheDispatcher”, “缓存数据过期:” + request.getUrl());mNetworkQueue.put(request);continue;}// We have a cache hit; parse its data for delivery back to the request.// 已经获取到了有效的缓存数据,回调给 request 的parseNetworkResponse,需要自己根据需求来解析数据request.addMarker(“cache-hit”);Response<?> response = request.parseNetworkResponse(new NetworkResponse(entry.data, entry.responseHeaders));request.addMarker(“cache-hit-parsed”);//判断缓存是否需要刷新if (!entry.refreshNeeded()) {// Completely unexpired cache hit. Just deliver the response.Log.i(“CacheDispatcher”, “获取缓存数据:” + request.getUrl());mDelivery.postResponse(request, response);} else {request.addMarker(“cache-hit-refresh-needed”);request.setCacheEntry(entry);// Mark the response as intermediate.response.intermediate = true;// Post the intermediate response back to the user and have// the delivery then forward the request along to the network.mDelivery.postResponse(request, response, new Runnable() {() {try {mNetworkQueue.put(request);} catch (InterruptedException e) {// Not much we can do about this.}}});}} catch (InterruptedException e) {// We may have been interrupted because it was time to quit.if (mQuit) {return;}continue;}}}

mDispatchers线程的 run 方法

() {Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);Request request;while (true) {try {// Take a request from the queue.//获取网络请求,当队列中为空的时候,阻塞request = mQueue.take();} catch (InterruptedException e) {// We may have been interrupted because it was time to quit.if (mQuit) {return;}continue;}try {request.addMarker(“network-queue-take”);(request.isCanceled()) {request.finish(“network-discard-cancelled”);continue;}// Tag the request (if API >= 14)if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {TrafficStats.setThreadStatsTag(request.getTrafficStatsTag());}// Perform the network request.//网络请求的基本操作(核心操作),从网络中获取数据NetworkResponse networkResponse = mNetwork.performRequest(request);request.addMarker(“network-http-complete”);(networkResponse.notModified && request.hasHadResponseDelivered()) {request.finish(“not-modified”);continue;}// Parse the response here on the worker thread.Response<?> response = request.parseNetworkResponse(networkResponse);request.addMarker(“network-parse-complete”);(request.shouldCache() && response.cacheEntry != null) {mCache.put(request.getCacheKey(), response.cacheEntry);request.addMarker(“network-cache-written”);}// Post the response back.request.markDelivered();mDelivery.postResponse(request, response);} catch (VolleyError volleyError) {parseAndDeliverNetworkError(request, volleyError);} catch (Exception e) {VolleyLog.e(e, “Unhandled exception %s”, e.toString());mDelivery.postError(request, new VolleyError(e));}}}真正的寂寞是在人群中,当你面对许多熟悉的脸,

Android Vollay解析(一)之GET、POST请求篇

相关文章:

你感兴趣的文章:

标签云: