Volley实现自定义的网络请求Implementing a Custom Request
来源:互联网 发布:java如何实现多线程 编辑:程序博客网 时间:2024/05/19 05:37
编写:kesenhoo - 原文:http://developer.android.com/training/volley/request-custom.html
这节课会介绍如何实现你自定义的请求类型,这些自定义的类型不属于Volley内置支持包里面。
Write a Custom Request
大多数的请求类型都已经包含在Volley的工具箱里面。如果你的请求返回数值是一个string,image或者JSON,那么你是不需要自己去实现请求类的。
对于那些你需要自定义的请求类型,你需要执行以下操作:
- 继承
Request<T>
类,<T>
表示请求返回的数据类型。因此如果你需要解析的响应类型是一个String,可以通过继承Request<String>
来创建你自定义的请求。请参考Volley工具类中的StringRequest与 ImageRequest来学习如何继承Request。 - 实现抽象方法
parseNetworkResponse()
与deliverResponse()
,下面会详细介绍。
parseNetworkResponse
为了能够提交一种指定类型的数据(例如,string,image,JSON等),需要对解析后的结果进行封装。下面会演示如何实现parseNetworkResponse()
。
@Overrideprotected Response<T> parseNetworkResponse( NetworkResponse response) { try { String json = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); return Response.success(gson.fromJson(json, clazz), HttpHeaderParser.parseCacheHeaders(response)); } // handle errors...}
请注意:
parseNetworkResponse()
的参数是类型是NetworkResponse
,这种参数包含了的响应数据内容有一个byte[],HTTP status code以及response headers.- 你实现的方法必须返回一个Response,它包含了你响应对象与缓存metadata或者是一个错误。
如果你的协议没有标准的cache机制,你可以自己建立一个Cache.Entry
, 但是大多数请求都可以用下面的方式来处理:
return Response.success(myDecodedObject, HttpHeaderParser.parseCacheHeaders(response));
Volley在工作线程中执行parseNetworkResponse()方法。这确保了耗时的解析操作,例如decode一张JPEG图片成bitmap,不会阻塞UI线程。
deliverResponse
Volley会把parseNetworkResponse()方法返回的数据带到主线程的回调中。如下所示:
protected void deliverResponse(T response) { listener.onResponse(response);
Example: GsonRequest
Gson是一个使用映射支持JSON与Java对象之间相互转换的库文件。你可以定义和JSON keys相对应名称的Java对象。把对象传递给传递Gson,然后Gson会帮你为对象填充字段值。 下面是一个完整的示例:演示了使用Gson解析Volley数据:
public class GsonRequest<T> extends Request<T> { private final Gson gson = new Gson(); private final Class<T> clazz; private final Map<String, String> headers; private final Listener<T> listener; /** * Make a GET request and return a parsed object from JSON. * * @param url URL of the request to make * @param clazz Relevant class object, for Gson's reflection * @param headers Map of request headers */ public GsonRequest(String url, Class<T> clazz, Map<String, String> headers, Listener<T> listener, ErrorListener errorListener) { super(Method.GET, url, errorListener); this.clazz = clazz; this.headers = headers; this.listener = listener; } @Override public Map<String, String> getHeaders() throws AuthFailureError { return headers != null ? headers : super.getHeaders(); } @Override protected void deliverResponse(T response) { listener.onResponse(response); } @Override protected Response<T> parseNetworkResponse(NetworkResponse response) { try { String json = new String( response.data, HttpHeaderParser.parseCharset(response.headers)); return Response.success( gson.fromJson(json, clazz), HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } catch (JsonSyntaxException e) { return Response.error(new ParseError(e)); } }}
如果你愿意使用的话,Volley提供了现成的JsonArrayRequest
与JsonArrayObject
类。参考上一课创建标准的网络请求
转自:http://hukai.me/android-training-course-in-chinese/connectivity/volley/request-custom.html
- Volley实现自定义的网络请求Implementing a Custom Request
- Implementing a Custom Request
- Transmitting Network Data Using Volley -Implementing a Custom Request
- Volley发送简单的网络请求(Sending a Simple Request)
- volley创建标准的网络请求(Making a Standard Request)
- Android-Volley网络通信框架(自定义Request 请求:实现 GsonRequest)
- 实现自定义模型(Implementing Custom Models)
- Implementing a Custom Component
- 使用Volley框架网络请求Request<T>的封装
- 10-3 实现自定义模型(Implementing Custom Models)
- 10-3 实现自定义模型(Implementing Custom Models)
- 【转载】10.4实现自定义代表(Implementing Custom Delegates)
- Qt中 实现自定义模型(Implementing Custom Models)
- Volley使用方法(三):自定义Request请求
- Volley来实现网络请求
- Android网络通信必备神器Volley详解——实现一个自定义的Request(以Gson为例)
- Android网络框架-Volley(五) 使用Volley发送自定义Request
- Volley的网络请求实例
- JS学习第七天----语句
- Discovery(3)
- 利用SecureCRT上传、下载文件(使用sz与rz命令),超实用!
- iOS UI10_带分区的省市区
- Nginx
- Volley实现自定义的网络请求Implementing a Custom Request
- PHP_PHP开发框架-Phalcon
- Android生命周期
- SVN 版本冲突解决
- 黑马程序员--------------java基础----------------- 图形化界面
- 怎么知道Java class文件JDK编译的版本号
- iOS开发 - 苹果开发者账号那些事儿(二)
- linux 变量01
- 树--红黑树