194_自定义FastJsonRequest

自定义FastJsonRequest

 

我们用了Volley

还是挺好用的

我还是挺喜欢用Volley

挺方便

 

Volley里面有很多Request

比如我们经常用的

StringRequest

JsonObjectRequest

JsonArrayRequest

ImageRequest

 

我们用JsonObjectRequest请求之后

得到JSONObject

当然就要解析了

我们平时解析有很多第三方库

比如GSON,FastJson等等

 

我们现在就用FastJson

但是我们现在不是慢慢对每个response解析

而是自定义一个FastJsonRequest

在这个自定义请求里面直接解析,

请求成功之后就得到解析后的对象

 

先把fastjson-1.2.4.jar放到libs里面

Add As Library一下

 

这个fastjson是阿里开发的,是国产的,

据说github上面国产的前100名几乎都是阿里的.

 

 

 

 

 

 

 

来来来,代码代码

 

我们来一个类继承VolleyRequest

public class FastJsonRequest extends Request{

 

}

 

实现一下两个方法

    @Override

    protected Response parseNetworkResponse(NetworkResponse response) {

        return null;

    }

 

    @Override

    protected void deliverResponse(Object response) {

 

    }

 

这里系统可能会提示还要实现一个compareTo方法,不用管

 

然后再来两个构造方法

    public FastJsonRequest(String url, Response.ErrorListener listener) {

        super(url, listener);

    }

 

    public FastJsonRequest(int method, String url, Response.ErrorListener listener) {

        super(method, url, listener);

    }

 

 

 

 

然后我们就是模仿VolleyStringRequest来写这个FastJsonRequest

 

实现的两个方法

1.parseNetworkResponse

2.deliverResponse

 

我们先到StringRequest里面看看parseNetworkResponse这个方法

    @Override

    protected Response 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));

    }

 

我们来看看分析一下这段代码

首先,返回类型是一个Response

方法的参数是(NetworkResponse response),

然后定义了一个String parsed;

trycatch捕捉UnsupportedEncodingException 不支持的编码异常

没出错,

parsed=new String(response.data, HttpHeaderParser.parseCharset(response.headers));

出错了,

parsed = new String(response.data);

最后返回

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

 

 

现在看的一知半解

但是我们可以看出来,这个String parsed

就是我们需要解析的字符串

我们先不管,把这段代码复制过来,放到我们的parseNetworkResponse方法里面

 

刚才说了,我们现在要把解析的过程放到我们的这个FastJsonRequest自定义请求里面

所以我们就把解析的过程放在这个方法里面执行

 

 

我们用JSONparse方法来解析

JSON.parseObject(parsed,???);

第二个参数本来是我们存放解析结果的bean

但是现在我们的这个FastJsonRequest自定义请求是通用的

所以我们不知道要用什么bean类来接收

所以我们就用动态的字节码对象来表示

同时我们要用泛型来动态控制

 

public class FastJsonRequest extends Request{.....}

private Class mClazz;

 

    @Override

    protected Response parseNetworkResponse(NetworkResponse response) {

        String parsed;

        try {

            parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));

        } catch (UnsupportedEncodingException e) {

            parsed = new String(response.data);

        }

        T t=JSON.parseObject(parsed, mClazz);

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

    }

 

返回的时候还要把t对象传出去

 

 

 

然后是deliverResponse方法

 

我们也是先到StringRequest里面看

里面是

private final Listener mListener;

    @Override

    protected void deliverResponse(String response) {

        mListener.onResponse(response);

    }

 

我们也是一样的复制进来,不过我们的泛型是T

所以泛型改成T

private final Listener mListener;

    @Override

    protected void deliverResponse(T response) {

        mListener.onResponse(response);

    }

 

 

 

然后我们看构造方法

两个构造方法都只有Response.ErrorListener,

我们平时用的时候当然是有Response.Listener,所以我们把Listener放进去

public FastJsonRequest(String url, Response.Listener successListener, Response.ErrorListener listener) {

         super(url, listener);

mListener=successListener;

}

 

public FastJsonRequest(int method, String url, Response.Listener successListener, Response.ErrorListener listener) {

         super(method, url, listener);

mListener=successListener;

}

 

 

还有我们的Class clazz也要传进去

    public FastJsonRequest(String url, Response.Listener successListener, Class clazz, Response.ErrorListener listener) {

        super(url, listener);

        mListener = successListener;

        mClazz=clazz;

    }

 

    public FastJsonRequest(int method, String url, Response.Listener successListener, Class clazz, Response.ErrorListener listener) {

        super(method, url, listener);

        mListener = successListener;

        mClazz=clazz;

    }

 

 

 

 

简单梳理一下

 

其实我们的过程很简单,几乎就是和StringRequest一模一样

只不过我们有2个区别

第一是我们加入了解析过程

第二是我们把泛型改成了我们自己的动态泛型

 

还有就是我们要加上参数

1Listener1Class

一个是本来就需要的,成功请求后的回调

一个是我们需要的动态的字节码对象

 

 

 

我们来用一下

 

        String url="http://000.000.000.000/file/product.json";

        FastJsonRequest productFastJsonRequest = new FastJsonRequest(url, new Response.Listener() {

            @Override

            public void onResponse(ProductBean response) {

                mTv.setText(response.data.get(0).name);

            }

        }, ProductBean.class, new Response.ErrorListener() {

            @Override

            public void onErrorResponse(VolleyError error) {

                mTv.setText("fail");

            }

        });

 

        RequestQueue requestQueue = Volley.newRequestQueue(getContext());

        requestQueue.add(productFastJsonRequest);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(194_自定义FastJsonRequest)