Android中的volley_10_Response和NetworkResponse
2015-06-04 20:45
429 查看
每次在文章的开头,都会感叹volley的面向接口的编程思想。当刚刚写本篇文章时,对这种思想突然有了更深一层的理解,在volley的核心流程中,往往都是接口在冲锋陷阵,这样的话,扩展性是极强的,因为你可以使用volley默认的实现类,也可以自己定义自己的实现类。非常优秀的框架设计,得好好研究研究怎么应用在自己的项目中。
嘿嘿,就不感叹volley了。
这里主要说下volley中的响应Response和NetworkResponse,以及二者之间的关系,注意了,这是两个单独的没有什么关系的类。
关于响应的三个类,区分一下:
1.HttpResponse:这是android原生的类,不是volley中定义的,在发出网络请求后就会返回该响应,在这里提一下主要是为后两者做个说明。该类中封装了响应的所有信息,如状态行、响应头、响应体等信息。
2.NetworkResponse:应当记得,在BasicNetwork执行网络请求的方法返回值就是该类:
3.Resposne:该类中定义了两个接口,主要是为volley的使用者提供的,分别是网络请求成功的回调和网络请求失败的回调。另外该类中封装了响应的数据体和数据体对应的JavaBean对象。那么Response和NetworkResponse的关系呢?注意在类Networkdispatcher中有这么一行代码:
先介绍下Response:
在Response中定义了两个重要的成员:
再就是两个回调监听,成功的回调和失败的回调:
当然,最为重要的一个方法就是success,该方法本质上就是根据缓存中的数据实体创建一个响应。
另一个方法就是isSuccess() ,在该方法内决定了请求是成功的还是失败的,由此来决定上面的成功和失败回调接口的调用:
在ExecutorDelivery内,传递响应时,就能确定是成功和失败的回调:
再就是NetworkResponse:
总之,Response体现在用户使用上,主要是对网络请求成功和失败的回调。NetworkResponse则是一个封装了响应数据的实体。
demo下载:http://download.csdn.net/detail/vvzhouruifeng/8747599
嘿嘿,就不感叹volley了。
这里主要说下volley中的响应Response和NetworkResponse,以及二者之间的关系,注意了,这是两个单独的没有什么关系的类。
关于响应的三个类,区分一下:
1.HttpResponse:这是android原生的类,不是volley中定义的,在发出网络请求后就会返回该响应,在这里提一下主要是为后两者做个说明。该类中封装了响应的所有信息,如状态行、响应头、响应体等信息。
2.NetworkResponse:应当记得,在BasicNetwork执行网络请求的方法返回值就是该类:
public NetworkResponse performRequest(Request<?> request) throws VolleyError对于该类可以理解为:将HttpResponse内比较重要的信息如状态行、响应头、响应体等信息抽取出来,跟volley中的一些业务信息合并成一个volley中特有的响应类。
3.Resposne:该类中定义了两个接口,主要是为volley的使用者提供的,分别是网络请求成功的回调和网络请求失败的回调。另外该类中封装了响应的数据体和数据体对应的JavaBean对象。那么Response和NetworkResponse的关系呢?注意在类Networkdispatcher中有这么一行代码:
// Parse the response here on the worker thread. 将响应解析出来 Response<?> response = request .parseNetworkResponse(networkResponse);其实就是在request内将NetworkResponse的内容进行提取,再根据这些内容生成Response,以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)); }
先介绍下Response:
在Response中定义了两个重要的成员:
/** Parsed response, or null in the case of error. 解析后的返回值,是一个json对应的bean对象 */ public final T result; /** Cache metadata for this response, or null in the case of error. 请求成功后,拿回来的数据,该数据被缓存,以后再有请求时从缓存拿数据 */ public final Cache.Entry cacheEntry;
再就是两个回调监听,成功的回调和失败的回调:
/** Callback interface for delivering parsed responses.请求成功的回调接口 */ public interface Listener<T> { /** Called when a response is received. 请求成功的回调方法*/ public void onResponse(T response); } /** Callback interface for delivering error responses. 请求失败的回调接口*/ public interface ErrorListener { /** * Callback method that an error has been occurred with the * provided error code and optional user-readable message. * * 请求失败的回调方法 */ public void onErrorResponse(VolleyError error); }
当然,最为重要的一个方法就是success,该方法本质上就是根据缓存中的数据实体创建一个响应。
/** 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); }
另一个方法就是isSuccess() ,在该方法内决定了请求是成功的还是失败的,由此来决定上面的成功和失败回调接口的调用:
/** * Returns whether this response is considered successful. 该响应是否成功 * error==null表示没有错误返回 也就是成功了 如果有error了 那么就表示不成功 */ public boolean isSuccess() { return error == null; }
在ExecutorDelivery内,传递响应时,就能确定是成功和失败的回调:
// Deliver a normal response or error, depending. // 如果响应成功 if (mResponse.isSuccess()) { // 就分发响应,该方法是一个抽象方法,参数是响应的JavaBean,需要子类去具体操作该bean mRequest.deliverResponse(mResponse.result); } else { // error不为空,也就是响应错误 分发错误 mRequest.deliverError(mResponse.error); }
再就是NetworkResponse:
/** * Data and headers returned from {@link Network#performRequest(Request)}. * * Network中方法 performRequest 的返回值,Request的 parseNetworkResponse(…) 方法入参,是 Volley * 中用于内部 Response 转换的一级。 封装了网络请求响应的 StatusCode,Headers 和 Body 等 */ public class NetworkResponse { /** * Creates a new network response. * * @param statusCode * the HTTP status code 状态响应码 * @param data * Response body 数据体 * @param headers * Headers returned with this response, or null for none 响应头 * @param notModified * True if the server returned a 304 and the data was already in * cache 如果返回的状态码是304,表示这数据已经在缓存中了 */ public NetworkResponse(int statusCode, byte[] data, Map<String, String> headers, boolean notModified) { this.statusCode = statusCode; this.data = data; this.headers = headers; this.notModified = notModified; } /** * 根据数据体,创建一个返回值,响应头为空,没有在缓存中 * @param data */ public NetworkResponse(byte[] data) { //响应状态码200 this(HttpStatus.SC_OK, data, Collections.<String, String> emptyMap(), false); } /** * 根据数据体和响应头创建一个返回值 没有在缓存中 * @param data 响应的数据体 * @param headers 响应头信息 */ public NetworkResponse(byte[] data, Map<String, String> headers) { this(HttpStatus.SC_OK, data, headers, false); } /** The HTTP status code. 状态码 */ public final int statusCode; /** Raw data from this response. 响应的数据体 也就是被缓存的数据 */ public final byte[] data; /** Response headers. 响应头*/ public final Map<String, String> headers; /** True if the server returned a 304 (Not Modified). 如果返回的状态码是304,表示这数据已经在缓存中了*/ public final boolean notModified; }
总之,Response体现在用户使用上,主要是对网络请求成功和失败的回调。NetworkResponse则是一个封装了响应数据的实体。
demo下载:http://download.csdn.net/detail/vvzhouruifeng/8747599
相关文章推荐
- [置顶] Android应用安全隐患现状,资源文件加密/安全防护进化史
- android ViewPager使用
- Android Studio 1.0.2 设置内存大小
- 强烈推荐android studio用的几个插件
- Android不同分辨率和不同密度适配
- MiniTwitterSimulate
- Android中asset文件夹和raw文件夹区别
- Android logcat
- android开发学习笔记系列(6)--代码规范
- Android之Intent传递数据
- Android中的volley_9_ResponseDelivery和ExecutorDelivery
- android自动登录界面
- AndroidImageView的使用
- android开发之学会使用百度地图
- 将VitamioBundle工程作为Android Library引入Demo工程使用即可
- Android自定义RatingBar
- arcgis for android apk太大
- arcgis for android apk太大
- Android中Gson解析json
- Android中的volley_8_缓存调度线程CacheDispatcher