Volley完全解析之自定义Request
来源:互联网 发布:windows hook框架 编辑:程序博客网 时间:2024/09/21 09:27
Volley的用法,我相信大家都非常熟悉了。一共分为三步:
1、new一个Request。
2、new一个RequestQueue。
3、将Request添加到RequestQueue中去。
Request类是所有请求的父类,Volley提供的它的子类常见的有StringRequest、JsonObjectRequest、JsonArrayRequest等。但是这些显然不能满足我们所有的需求,比如说我们想用Gson来解析Json数据,希望发送请求后直接能够得到Bean对象,那么我们就得来自己设计GsonRequest。
那么,我们就来一步步实现GsonRequest。
1、写一个GsonRequest类继承Request。
/** * Created by leevi on 16/9/23. */public class GsonRequest extends Request { public GsonRequest(int method, String url, Response.ErrorListener listener) { super(method, url, listener); } @Override protected Response parseNetworkResponse(NetworkResponse response) { return null; } @Override protected void deliverResponse(Response response) { }}
从上述代码我们可以发现,必须重写parseNetworkResponse和deliverResponse两个方法。
先看第一个方法吧,parseNetworkResponse方法。既然是自定义Request,那么我们就参考StringRequest来看看parseNetworkResponse这个方法到底做了什么事情。
下面是StringRequest中parseNetworkResponse方法的代码
@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)); }
方法的具体实现其实很简单,就是将服务器响应的数据解析成String出来,并调用Response.success方法将数据包装后return出去。
那我们也依葫芦画瓢来重写咱们GsonRequest的代码
/** * Created by leevi on 16/9/23. */public class GsonRequest<T> extends Request<T> { private final Gson gson = new Gson(); private final Class<T> clazz; public GsonRequest(String url, Response.ErrorListener listener, Class<T> clazz) { super(Method.GET, url, listener);//默认Get请求 this.clazz = clazz; } @Override protected Response<T> parseNetworkResponse(NetworkResponse response) { try { /** * 得到返回的数据 */ String jsonStr = new String(response.data); /** * 转化成对象 */ return Response.success(gson.fromJson(jsonStr, clazz), HttpHeaderParser.parseCacheHeaders(response)); } catch (JsonSyntaxException e) { return Response.error(new ParseError(e)); } } @Override protected void deliverResponse(T response) { }}
在parseNetworkResponse方法中使用Gson将response解析成Bean对象,并调用Response.success方法将数据包装后return出去。
接下来咱们看看StringRequest中的第二个方法——deliverResponse方法。
@Override protected void deliverResponse(String response) { mListener.onResponse(response); }
具体实现更加简单,就是通过mListener将解析出来的response传递出去到给用户。至于deliverResponse方法是何时何地调用、怎么获取解析后的数据的,且看下篇——Volley源码分析,给各位看官慢慢道来。
咱们接着依葫芦画瓢来继续完成咱们的GsonRequest类。
/** * Created by leevi on 16/9/23. */public class GsonRequest<T> extends Request<T> { private final Gson gson = new Gson(); private final Class<T> clazz; private final Response.Listener<T> mListener; public GsonRequest(String url, Response.ErrorListener listener, Class<T> clazz, Response.Listener<T> listener1) { super(Method.GET, url, listener);//默认get请求 this.clazz = clazz; mListener = listener1; } @Override protected Response<T> parseNetworkResponse(NetworkResponse response) { try { /** * 得到返回的数据 */ String jsonStr = new String(response.data); /** * 转化成对象 */ return Response.success(gson.fromJson(jsonStr, clazz), HttpHeaderParser.parseCacheHeaders(response)); } catch (JsonSyntaxException e) { return Response.error(new ParseError(e)); } } @Override protected void deliverResponse(T response) { //将数据传递出去。 mListener.onResponse(response); }}至此,自定义GsonRequest就完成了,当我们使用GsonRequest发送请求时,我们就能在成功的回调中直接获取解析出来的Bean对象了。
用法如下:
GsonRequest request = new GsonRequest(url, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }, Bean.class, new Response.Listener() { @Override public void onResponse(Bean response) { //获取到Bean对象 } }); RequestQueue requestQueue = Volley.newRequestQueue(this); requestQueue.add(request);是不是很简单?就是依葫芦画瓢,要弄清楚Volley源码中的运行机制的话,请期待下一篇——Volley源码解析。
0 0
- Volley完全解析之自定义Request
- Android Volley 之自定义Request
- Android Volley 之自定义Request
- Android Volley 之自定义Request
- Android Volley 之自定义Request
- Android Volley 之自定义Request
- Android Volley 之自定义Request
- Android Volley 之自定义Request
- Android Volley 之自定义Request
- Android Volley之自定义request
- Android Volley 之自定义Request
- Android Volley完全解析之定制自己的Request XMLRequest GsonRequest
- Android Volley完全解析(三),定制自己的Request
- Android Volley完全解析(三),定制自己的Request
- Android Volley完全解析(三),定制自己的Request
- [原]Android Volley完全解析(三),定制自己的Request
- Android Volley完全解析(三),定制自己的Request
- Android Volley完全解析(三),定制自己的Request
- 【剑指offer】替换空格
- 基础类库:Calendar类
- nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)
- 无状态
- POJ 3343 Against Mammoths (二分匹配)
- Volley完全解析之自定义Request
- Ubuntu安装scrapy奇葩出错
- 两篇sharedpreference文章
- 【JZOJ4817】square
- elk系统通过nginx添加对kibana的登录认证
- Java Web MVC开发,eclipse EE+mysql+tomcat+struts2+新浪SAE(三)
- Codeforces Round #375 (Div. 2) 题解
- C++ 常用&生僻函数小记
- 第一部分 Android中利用Handler实现消息的分发机制