Volley网络请求的第四篇,废话不多说,开始。
这一篇文章将会教你怎样在Volley支持的范围内定制一个请求。
第一步:写一个通用请求:
大多数请求都有已经写好的接口供你调用,如果你的请求是String、image、JSON之类,那么你就不需要定制请求类型,反之你可能要自己实现。
定制请求的实现步骤:
1、继承Request<T>类,其中T代表你的请求希望的返回类型,如果你期望的返回类型是String,那么你可以这样定制:Request<String>,正式因为如此
Volley中的StringRequest和ImageRequest就是继承的Request<T>。
2、完成parseNetworkResponse()和deliverResponse()方法,栗子如下:
parseNetworkResponse
@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 ... }
请注意:
parseNetworkResponse()把NetworkResponse作为参数,NetworkResponse包括了字节流,返回状态,返回头。这个函数的实现必须包含一个Response<T>类型的
返回,里面包括你定制的返回对象、缓存元数据或者是一个错误,比如说解析错误。
如果你有一个非标准的缓存要求,你可以自己创建一个Cache.Entity,但大多数情况是这样的:
1 return Response.success(myDecodedObject, HttpHeaderParser.parseCacheHeaders(response));
Volley在工作线程里面调用解析的方法,以免在解析繁杂的数据时候阻塞主线程,比如说把jepg格式的图片解码成Bitmap类型。
例子:GsonRequest
Gson可以把java类型和Json类型相互转换,你可以定义一个java类型,这个类型的字段和与之对应的json键友相同的名字,把这个对象传给Gson,gson就会为你填充json字段
,下面使用gson解析的例子:
1 public class GsonRequest<T> extends Request<T> { 2 private final Gson gson = new Gson(); 3 private final Class<T> clazz; 4 private final Map<String, String> headers; 5 private final Listener<T> listener; 6 7 /** 8 * Make a GET request and return a parsed object from JSON. 9 * 10 * @param url URL of the request to make 11 * @param clazz Relevant class object, for Gson's reflection 12 * @param headers Map of request headers 13 */ 14 public GsonRequest(String url, Class<T> clazz, Map<String, String> headers, 15 Listener<T> listener, ErrorListener errorListener) { 16 super(Method.GET, url, errorListener); 17 this.clazz = clazz; 18 this.headers = headers; 19 this.listener = listener; 20 } 21 22 @Override 23 public Map<String, String> getHeaders() throws AuthFailureError { 24 return headers != null ? headers : super.getHeaders(); 25 } 26 27 @Override 28 protected void deliverResponse(T response) { 29 listener.onResponse(response); 30 } 31 32 @Override 33 protected Response<T> parseNetworkResponse(NetworkResponse response) { 34 try { 35 String json = new String( 36 response.data, 37 HttpHeaderParser.parseCharset(response.headers)); 38 return Response.success( 39 gson.fromJson(json, clazz), 40 HttpHeaderParser.parseCacheHeaders(response)); 41 } catch (UnsupportedEncodingException e) { 42 return Response.error(new ParseError(e)); 43 } catch (JsonSyntaxException e) { 44 return Response.error(new ParseError(e)); 45 } 46 } 47 }