关于volley的源码与扩展分享(二)

一些关于volley分享扩展分享 volley基本用法、具体如何请求数据本文不做解释,本次目的是一起尝试如何扩展一下。

  • 源码简单分析
  • 实用扩展

二、实用扩展

以往根据官方的volley实现方案我们要从服务器请求一个json字符串,然后还要再从回调里面解析json成对应的Object,重复劳动的同时,代码整洁性也差。那么能不能也一起封装起来呢?答案是可以的。

  1. 我们首先从回调开始,想要达到的效果是直接返回我们想要的对象Object,但是又不确定Object类型,那么就需要用到泛型,先定义一个接口。
public interface HttpResponseListener {

    /**
     * 成功回调
     *
     * @param t
     */
    void onSuccess(T t);

    /**
     * 连接异常等等
     *
     * @param error
     */
    void onError(Exception error);

    /**
     * 请求完毕
     */
    void onFinish();

通过onSuccess返回自己想要的数据类型。

通过onError返回访问期间发生的错误。

通过onFinish通知已经完成访问,onSuccess和onError之后都会执行该方法。

2.我们开始定义我们自己的request,既然我上报给后台的也是Json,那么继承JsonRequest会简单的多。也可以继承Requset,根据自己的需要决定。代码如下:

public class ObjectFromJsonObjectRequst extends JsonRequest {
    private HttpResponseListener listener;


    public ObjectFromJsonObjectRequst(int method,
                                      String url,
                                      JSONObject jsonRequest,
                                      HttpResponseListener listener) {
        super(method, url, jsonRequest.toString(), null, null);
        this.listener = listener;
    }


    @Override
    protected void deliverResponse(String response) {

        String data = response.toString();
        Log.d("HttpRespose", "HttpRespose--> " + data);

        Type[] genericInterfaces = listener.getClass().getGenericInterfaces();

        Type type = ((ParameterizedType) genericInterfaces[0]).getActualTypeArguments()[0];

        try {

            Object object = GsonHelper.fromJson(data, type);

            this.listener.onSuccess(object);

        } catch (Exception e) {
            Log.e("HttpRespose", "error: 数据解析异常,请检查数据结构...");
            this.listener.onError(e);
        } finally {
            this.listener.onFinish();
        }
    }

    @Override
    public void deliverError(VolleyError error) {
        Log.e("HttpRespose", "error:" + error.getMessage());
        this.listener.onError(error);
        this.listener.onFinish();
    }


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

这里指定了JsonRequst的类型为String是因为返回的byte数组转为String类型后再通过HttpResponseListener进行结果回调。
byte数组转String不用多说。String转Object可以用Google的Gson等。

首先重写parseNetworkResponse方法把byte转成String。

然后deliverResponse将String转成对应的Object。具体怎么转,看deliverResponse中实现。

Demo源码

你可能感兴趣的:(关于volley的源码与扩展分享(二))