Volley完全解析之自定义Request

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值