现在的位置: 首页 > 编程技术 > 安卓开发 > 正文

Google Volley使用之自定义

2015年10月31日 安卓开发 ⁄ 共 3548字 ⁄ 字号 Google Volley使用之自定义已关闭评论 ⁄ 阅读 405 次

开源项目链接

Volley自定义 Android Developer文档

Volley主页:https://android.googlesource.com/platform/frameworks/volley

Volley仓库:git clone https://android.googlesource.com/platform/frameworks/volley

Volley GitHub Demo:在GitHub主页搜索Volley会有很多,不过建议阅读Android Developer文档。


背景知识

Most requests have ready-to-use implementations in the toolbox; if your response is a string, image, or JSON, you probably won’t need to implement a custom Request.

For cases where you do need to implement a custom request, this is all you need to do:

  • Extend the Request class, where represents the type of parsed response the request expects. So if your parsed response is a string, for example, create your custom request by extending Request. See the Volley toolbox classes StringRequest and ImageRequest for examples of extending Request.
  • Implement the abstract methods parseNetworkResponse() and deliverResponse(), described in more detail below.

正如官方牛逼的说法一样:

你要是请求的是string, image, or JSON还好办,有现成的,前一篇已经详细说明了。But你要是返回的不是这些呢?那就比较蛋疼,需要自定义。 不过好的一点是Volley框架的扩展性非常好。所以如果需要customer的话你需要按照如下处理:

  • 继承Request类,就是你的响应数据格式。你可以在写customer的时候参考StringRequest实现。
  • 实现parseNetworkResponse() and deliverResponse()两个抽象方法。 在StringRequest中,deliverResponse()方法调用了mListener中的onResponse()方法,并将response内容传入。 parseNetworkResponse()方法对服务器响应的数据进行解析,数据是字节的形式放在NetworkResponse的data变量中的, 这里将数据取出然后组装成一个String,并传入Response的success()方法中。

开搞一个实现

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));
        }
    }
}

这是官方的GSON的反馈解析实现。

public class XMLRequest extends Request<XmlPullParser> {  
 
    private final Listener<XmlPullParser> listener;  
 
    public XMLRequest(int method, String url, Listener<XmlPullParser> listener,  
            ErrorListener errorListener) {  
        super(method, url, errorListener);  
        this.listener = listener;  
    }  
 
    public XMLRequest(String url, Listener<XmlPullParser> listener, ErrorListener errorListener) {  
        this(Method.GET, url, listener, errorListener);  
    }  
 
    @Override 
    protected Response<XmlPullParser> parseNetworkResponse(NetworkResponse response) {  
        try {  
            String xmlString = new String(response.data,  
                    HttpHeaderParser.parseCharset(response.headers));  
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();  
            XmlPullParser xmlPullParser = factory.newPullParser();  
            xmlPullParser.setInput(new StringReader(xmlString));  
            return Response.success(xmlPullParser, HttpHeaderParser.parseCacheHeaders(response));  
        } catch (UnsupportedEncodingException e) {  
            return Response.error(new ParseError(e));  
        } catch (XmlPullParserException e) {  
            return Response.error(new ParseError(e));  
        }  
    }  
 
    @Override 
    protected void deliverResponse(XmlPullParser response) {  
        listener.onResponse(response);  
    }  
}

这是一个XmlPullParser反馈解析的实现。

通过如上你会发现Volley框架不愧于是Google大牛搞的,连拓展自定义都这么方便,设计模式运用的出神入化,膜拜。

抱歉!评论已关闭.