Volley使用指南第四回(来自developer.android)

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 }

 

posted @ 2015-10-20 09:14  loutao  阅读(253)  评论(0编辑  收藏  举报