Android 关于volley的一些源码和扩展 (二)

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

二、实用扩展

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

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

    /**
     * 成功回调
     *
     * @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<String> {
    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<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));
    }
}

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

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

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

Demo源码

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值