Android 关于volley的一些源码和扩展 (二)
来源:互联网 发布:lg pd251软件 编辑:程序博客网 时间:2024/06/05 11:47
一些关于volley分享扩展分享 volley基本用法、具体如何请求数据本文不做解释,本次目的是一起尝试如何扩展一下。
- 源码简单分析
- 实用扩展
二、实用扩展
以往根据官方的volly实现方案我们要从服务器请求一个json字符串,然后还要再从回调里面解析json成对应的Object,重复劳动的同时,代码整洁性也差。那么能不能也一起封装起来呢?答案是可以的。
- 我们首先从回调开始,想要达到的效果是直接返回我们想要的对象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 0
- Android 关于volley的一些源码和扩展 (二)
- Android 关于volley的一些源码和扩展 (一)
- [Android]Volley源码分析(二)Cache
- [Android]Volley源码分析(二)初始化
- Android中关于Volley的使用(二)从RequestQueue开始来深入认识Volley
- android Volley的源码分析
- 关于volley的一些分析-初始化
- 关于Volley二次封装的一些想法
- Volley源码解析(二)
- Volley源码分析二
- Volley(二) 源码分析
- Volley源码解析(二)
- 关于Android的一些设计(二)
- 【进阶android】Volley源码分析——Volley的流程
- 【进阶android】Volley源码分析——Volley的线程
- 【进阶android】Volley源码分析——Volley的缓存
- Android Volley 带你从源码的角度理解Volley
- Volley(二),扩展 && 原理
- 第六章 Realm及相关对象
- TCP选项:TCP_NODELAY和TCP_CORK(negle算法)
- php 变量得作用域
- android 使用外部字体
- PHP验证码生成
- Android 关于volley的一些源码和扩展 (二)
- IndexedDB使用(基本函数封到Angular2的service里)
- SSH无密码登入非root用户设置
- MATLAB代码下载地址
- JPush极光推送详解
- 查看CentOS版本信息
- Android自定义domain设置SeAndroid权限
- PHP数组(集合)与数组(集合)的操作
- Android 自定义MediaController