Volley框架的基本解读(六)
来源:互联网 发布:手机淘宝爱逛街找不到 编辑:程序博客网 时间:2024/06/03 16:11
接上一遍内容,我们继续解析,来揭开mDelivery的神秘面纱,它的类是ResponseDelivery,来看源码:
public interface ResponseDelivery { /** * Parses a response from the network or cache and delivers it. */ public void postResponse(Request<?> request, Response<?> response); /** * Parses a response from the network or cache and delivers it. The provided * Runnable will be executed after delivery. */ public void postResponse(Request<?> request, Response<?> response, Runnable runnable); /** * Posts an error for the given request. */ public void postError(Request<?> request, VolleyError error);}
这里接口,里面有三个方法,分别用于分发正确结果,分发正确结果并执行Runnable,分发错误结果。
实例的创建是在RequestQueue的构造方法中
public RequestQueue(Cache cache, Network network, int threadPoolSize) { this(cache, network, threadPoolSize, new ExecutorDelivery(new Handler(Looper.getMainLooper()))); }
那么我们先从ExecutorDelivery的构造方法看起
public ExecutorDelivery(final Handler handler) { // Make an Executor that just wraps the handler. mResponsePoster = new Executor() { @Override public void execute(Runnable command) { handler.post(command); } }; }
代码很清晰,只是执行了handler.post方法,ResponseDelivery接口抽象方法的复写
@Override public void postResponse(Request<?> request, Response<?> response) { postResponse(request, response, null); }
继续看
@Override public void postResponse(Request<?> request, Response<?> response, Runnable runnable) { request.markDelivered(); request.addMarker("post-response"); mResponsePoster.execute(new ResponseDeliveryRunnable(request, response, runnable)); }
仅有三句代码,分别是标记分发事件完毕,调试信息,执行一个Runnable,ResponseDeliveryRunnable就是Runnable,看源码
private class ResponseDeliveryRunnable implements Runnable
看run方法
@SuppressWarnings("unchecked") @Override public void run() { // If this request has canceled, finish it and don't deliver. // 如果该request已经取消,则停止分发 if (mRequest.isCanceled()) { mRequest.finish("canceled-at-delivery"); return; } // Deliver a normal response or error, depending. if (mResponse.isSuccess()) { mRequest.deliverResponse(mResponse.result); } else { mRequest.deliverError(mResponse.error); } // If this is an intermediate response, add a marker, otherwise we're done // and the request can be finished. if (mResponse.intermediate) { mRequest.addMarker("intermediate-response"); } else { mRequest.finish("done"); } // If we have been provided a post-delivery runnable, run it. if (mRunnable != null) { mRunnable.run(); } }
判断request是否取消,这段代码已经出现多次了,在判断请求是否成功,我们点进去看看
/** * Returns whether this response is considered successful. * * 是否成功 */ public boolean isSuccess() { return error == null; }
error就是VolleyError,在网络请求的时候我们说过,仅有两种方式可以跳出循环,要么请求成功,要么抛出异常,先说请求成功BasicNetwork将服务器返回信息封装成NetworkResponse给予返回,NetworkDispatcher有这样一句代码对它进行解析:
// 交由Request进行解析Response Response<?> response = request.parseNetworkResponse(networkResponse);
parseNetworkResponse是定义在request中的抽象方法,我们找一个具体子类看看,StringRequest的源码:
@Override protected Response<String> parseNetworkResponse(NetworkResponse response) { String parsed; try { parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); } catch (UnsupportedEncodingException e) { parsed = new String(response.data); } return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response)); }
HttpHeaderParser.parseCharset(response.headers)是从请求头中找出编码格式,绝大多数结果都是UTF-8,重点在return的这段代码,HttpHeaderParser.parseCacheHeaders(response)意思是从response中解析出一个实体。
/** * Returns a successful response containing the parsed result. * * 成功 */ public static <T> Response<T> success(T result, Cache.Entry cacheEntry) { return new Response<T>(result, cacheEntry); }
private Response(T result, Cache.Entry cacheEntry) { this.result = result; this.cacheEntry = cacheEntry; this.error = null; }
看到重点了吗?this.error = null,成功error就是null。
思路回到BasicNetwork如果抛出异常,NetworkDispatcher调用这段代码:
mDelivery.postError(request, new VolleyError(e));
看ExecutorDelivery的具体实现
@Override public void postError(Request<?> request, VolleyError error) { request.addMarker("post-error"); Response<?> response = Response.error(error); mResponsePoster.execute(new ResponseDeliveryRunnable(request, response, null)); }
重点来了,Response<?> response = Response.error(error);上代码:
/** * Returns a failed response containing the given error code and an optional * localized message displayed to the user. * * 失败 */ public static <T> Response<T> error(VolleyError error) { return new Response<T>(error); }
private Response(VolleyError error) { this.result = null; this.cacheEntry = null; this.error = error; }
看到了吧,this.error = error,失败error不为null。
mResponse.isSuccess()就可以做出正确的判断,request调用deliverResponse分发结果,这也是一个抽象方法,在拿StringRequest的实现看看:
@Override protected void deliverResponse(String response) { mListener.onResponse(response); }
mListener这就是我们给的成功回调
deliverError是定义在request的方法
public void deliverError(VolleyError error) { if (mErrorListener != null) { mErrorListener.onErrorResponse(error); } }
接着主线走,mResponse.intermediate是命中过期缓存标志,是打出调试信息,否结束request,最后mRunnable不为null,给予执行。
夫万象森罗,不离两仪所育;百法纷凑,无越三教之境。
至此Volley主线以全部走通,后面会单独解析Request与Response这两个重中之重。
0 0
- Volley框架的基本解读(六)
- Volley框架的基本解读(一)
- Volley框架的基本解读(二)
- Volley框架的基本解读(三)
- Volley框架的基本解读(四)
- Volley框架的基本解读(五)
- Volley框架的基本解读(七)
- Volley框架的基本解读(八)
- volley框架的解读
- Volley的框架解读六(消息分发器ResponseDelivery和ExecutorDelivery)
- Volley的框架解读准备一HttpURLConnection
- Volley的框架解读七(Request)
- Volley框架的基本使用方法
- Volley框架的基本使用方法
- Volley===Volley框架的基本使用方法
- Volley===Volley框架的基本使用方法
- Android Volley网络框架的基本使用
- 开源框架--Volley的基本应用
- 良好的书写规范提高PHP代码执行效率
- Android 简述touch事件中的MotionEvent
- Reducer类——hadoop
- @SuppressLint("NewApi")和@TargetApi()的区别
- 如何增加微信朋友圈分享链接的小图片
- Volley框架的基本解读(六)
- 《Python基础教程》学习笔记 Chap3 使用字符串
- Cacti使用安装详解
- Oracle查看分区、索引、表占用空间大小
- 阿里云服务器Ubuntu安装mysql
- github 提交代码 failed to push some refs to git
- PB 用POSTURL()例子
- nordic51 52 设置静态密码的方法
- SSH安全加固