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

来源:互联网 发布:lg pd251软件 编辑:程序博客网 时间:2024/06/05 11:47

一些关于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源码

原创粉丝点击