技术文“译”站Android程序员

【译】Volley官方文档五:实现一个自定义的Request

2016-03-20  本文已影响627人  Lshare_Blog

原文链接:Implementing a Custom Request

这节课教你:

这节课描述了如何实现自定义的请求类型,这些请求类型不是Volley现成的(out-of-the-box)支持。

写一个自定义的请求

多数请求在(Volley)工具箱中都有随时可用的(ready-to-use)实现;如果响应是字符串、图像或者JSON,那你大可不必实现自定义的Request

当需要自己实现一个request时,下面的步骤是必须的:

parseNetworkResponse

Response类使用给定的类型(比如字符串、图片或JSON)封装了一个解析了的响应,用于传递。下面是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
...
}

注意下面的几条:

如果你的协议中没有标准的缓存说明,你可以自己构建一个Cache.Entry,但是大多数的请求只要如下这样就够了(?):

return Response.success(myDecodedObject,
        HttpHeaderParser.parseCacheHeaders(response));

Volley从工作线程调用parseNetworkResponse()。这样保证了昂贵的解析操作,比如解码一个JPEG图片成Bitmap,不会中断UI线程。

deliverResponse

Volley将parseNetworkResponse()中返回的对象传递到主线程。多数请求会在此调用一个回调接口,比如:

protected void deliverResponse(T response) {
        listener.onResponse(response);

例子:GsonRequest

Gson是一个库,它通过反射技术实现Java对象和JSON之间的转化。你可以使用跟JSON的key相对应的名字创建java对象,然后传递给Gson对象,接着Gson就会帮你填充字段值。下面是一个关于Volley请求和使用Gson解析的完整例子:

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提供了可以直接用的JsonArrayRequestJsonArrayObject类。查阅Using Standard Request Types获取更多信息。

项目源码下载点击下载


系列索引


更新日志:

上一篇 下一篇

猜你喜欢

热点阅读