编写:kesenhoo - 原文:http://developer.android.com/training/volley/request-custom.html
这节课会介绍如何实现自定义的请求类型,这些自定义的类型不属于 Volley 内置支持包里面。
大多数的请求类型都已经包含在 Volley 的工具箱里面。如果我们的请求返回数值是一个 string,image 或者 JSON,那么是不需要自己去实现请求类的。
对于那些需要自定义的请求类型,我们需要执行以下操作:
Request<T>
<T>
Request<String>
StringRequest
ImageRequest
parseNetworkResponse()
deliverResponse()
一个 Response 封装了用于发送的给定类型(例如,string、image、JSON等)解析过的响应。下面会演示如何实现 parseNetworkResponse():
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)); } // handle errors ... }
请注意:
NetworkResponse
Response<T>
如果我们的协议没有标准的缓存机制,那么我们可以自己建立一个 Cache.Entry, 但是大多数请求都可以用下面的方式来处理:
Cache.Entry
return Response.success(myDecodedObject, HttpHeaderParser.parseCacheHeaders(response));
Volley 在工作线程中执行 parseNetworkResponse() 方法。这确保了耗时的解析操作,例如 decode 一张 JPEG 图片成 bitmap,不会阻塞 UI 线程。
Volley 会把 parseNetworkResponse() 方法返回的数据带到主线程的回调中。如下所示:
protected void deliverResponse(T response) { listener.onResponse(response);
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类。参考上一课创建标准的网络请求。
JsonArrayRequest
JsonArrayObject
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8