Volley完全解析之自定义Request

来源:互联网 发布:windows hook框架 编辑:程序博客网 时间:2024/09/21 09:27

Volley的用法,我相信大家都非常熟悉了。一共分为三步:

1、new一个Request。

2、new一个RequestQueue。

3、将Request添加到RequestQueue中去。

Request类是所有请求的父类,Volley提供的它的子类常见的有StringRequest、JsonObjectRequest、JsonArrayRequest等。但是这些显然不能满足我们所有的需求,比如说我们想用Gson来解析Json数据,希望发送请求后直接能够得到Bean对象,那么我们就得来自己设计GsonRequest。

那么,我们就来一步步实现GsonRequest。

1、写一个GsonRequest类继承Request。

/** * Created by leevi on 16/9/23. */public class GsonRequest extends Request {    public GsonRequest(int method, String url, Response.ErrorListener listener) {        super(method, url, listener);    }    @Override    protected Response parseNetworkResponse(NetworkResponse response) {        return null;    }    @Override    protected void deliverResponse(Response response) {    }}

从上述代码我们可以发现,必须重写parseNetworkResponse和deliverResponse两个方法。

先看第一个方法吧,parseNetworkResponse方法。既然是自定义Request,那么我们就参考StringRequest来看看parseNetworkResponse这个方法到底做了什么事情。

下面是StringRequest中parseNetworkResponse方法的代码

@Override    protected Response<String> parseNetworkResponse(NetworkResponse response) {        String parsed;        try {            parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));        } catch (UnsupportedEncodingException e) {            parsed = new String(response.data);        }        return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));    }

方法的具体实现其实很简单,就是将服务器响应的数据解析成String出来,并调用Response.success方法将数据包装后return出去。

那我们也依葫芦画瓢来重写咱们GsonRequest的代码

/** * Created by leevi on 16/9/23. */public class GsonRequest<T> extends Request<T> {    private final Gson gson = new Gson();    private final Class<T> clazz;    public GsonRequest(String url, Response.ErrorListener listener, Class<T> clazz) {        super(Method.GET, url, listener);//默认Get请求        this.clazz = clazz;    }    @Override    protected Response<T> parseNetworkResponse(NetworkResponse response) {        try        {            /**             * 得到返回的数据             */            String jsonStr = new String(response.data);            /**             * 转化成对象             */            return Response.success(gson.fromJson(jsonStr, clazz), HttpHeaderParser.parseCacheHeaders(response));        } catch (JsonSyntaxException e)        {            return Response.error(new ParseError(e));        }    }    @Override    protected void deliverResponse(T response) {    }}

在parseNetworkResponse方法中使用Gson将response解析成Bean对象,并调用Response.success方法将数据包装后return出去。


接下来咱们看看StringRequest中的第二个方法——deliverResponse方法。

@Override    protected void deliverResponse(String response) {        mListener.onResponse(response);    }

具体实现更加简单,就是通过mListener将解析出来的response传递出去到给用户。至于deliverResponse方法是何时何地调用、怎么获取解析后的数据的,且看下篇——Volley源码分析,给各位看官慢慢道来。

咱们接着依葫芦画瓢来继续完成咱们的GsonRequest类。

/** * Created by leevi on 16/9/23. */public class GsonRequest<T> extends Request<T> {    private final Gson gson = new Gson();    private final Class<T> clazz;    private final Response.Listener<T> mListener;    public GsonRequest(String url, Response.ErrorListener listener, Class<T> clazz, Response.Listener<T> listener1) {        super(Method.GET, url, listener);//默认get请求        this.clazz = clazz;        mListener = listener1;    }    @Override    protected Response<T> parseNetworkResponse(NetworkResponse response) {        try        {            /**             * 得到返回的数据             */            String jsonStr = new String(response.data);            /**             * 转化成对象             */            return Response.success(gson.fromJson(jsonStr, clazz), HttpHeaderParser.parseCacheHeaders(response));        } catch (JsonSyntaxException e)        {            return Response.error(new ParseError(e));        }    }    @Override    protected void deliverResponse(T response) {        //将数据传递出去。        mListener.onResponse(response);    }}
至此,自定义GsonRequest就完成了,当我们使用GsonRequest发送请求时,我们就能在成功的回调中直接获取解析出来的Bean对象了。

用法如下:

GsonRequest request = new GsonRequest(url, new Response.ErrorListener() {            @Override            public void onErrorResponse(VolleyError error) {            }        }, Bean.class, new Response.Listener() {            @Override            public void onResponse(Bean response) {                //获取到Bean对象            }        });        RequestQueue requestQueue = Volley.newRequestQueue(this);        requestQueue.add(request);
是不是很简单?就是依葫芦画瓢,要弄清楚Volley源码中的运行机制的话,请期待下一篇——Volley源码解析。


0 0