Volley详解之自定义volley请求

Volley的用法,相信大家都很熟悉了。一共分为三步,我称它为Volley三部曲:

1、new一个Request。(创建请求对象)

2、new一个RequestQueue。(创建请求对列)

3、将Request添加到RequestQueue中去。(把请求对象添加到请求队列中)

Request类是所有请求的父类,Volley提供的它的子类常见的有StringRequest、JsonObjectRequest、JsonArrayRequest等。但是这些显然不能满足我们所有的需求,比如说我们想用Gson来解析Json数据,希望发送请求后直接能够得到Bean对象,那么我们就得来自己设计GsonRequest。

那么,我们就来一步步实现GsonRequest。

1、写一个GsonRequest类继承Request。

[java]  view plain  copy
  1. /** 
  2.  * Created by leevi on 16/9/23. 
  3.  */  
  4. public class GsonRequest extends Request {  
  5.   
  6.     public GsonRequest(int method, String url, Response.ErrorListener listener) {  
  7.         super(method, url, listener);  
  8.     }  
  9.   
  10.     @Override  
  11.     protected Response parseNetworkResponse(NetworkResponse response) {  
  12.         return null;  
  13.     }  
  14.   
  15.     @Override  
  16.     protected void deliverResponse(Response response) {  
  17.   
  18.     }  
  19. }  

从上述代码我们可以发现,必须重写parseNetworkResponse和deliverResponse两个方法。

先看第一个方法吧,parseNetworkResponse方法。既然是自定义Request,那么我们就参考StringRequest来看看parseNetworkResponse这个方法到底做了什么事情。

下面是StringRequest中parseNetworkResponse方法的代码

[java]  view plain  copy
  1. @Override  
  2.     protected Response parseNetworkResponse(NetworkResponse response) {  
  3.         String parsed;  
  4.         try {  
  5.             parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));  
  6.         } catch (UnsupportedEncodingException e) {  
  7.             parsed = new String(response.data);  
  8.         }  
  9.         return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));  
  10.     }  

方法的具体实现其实很简单,就是将服务器响应的数据解析成String出来,并调用Response.success方法将数据包装后return出去。

那我们也依葫芦画瓢来重写咱们GsonRequest的代码

[java]  view plain  copy
  1. /** 
  2.  * Created by leevi on 16/9/23. 
  3.  */  
  4. public class GsonRequest extends Request {  
  5.     private final Gson gson = new Gson();  
  6.     private final Class clazz;  
  7.     public GsonRequest(String url, Response.ErrorListener listener, Class clazz) {  
  8.         super(Method.GET, url, listener);//默认Get请求  
  9.         this.clazz = clazz;  
  10.     }  
  11.   
  12.     @Override  
  13.     protected Response parseNetworkResponse(NetworkResponse response) {  
  14.         try  
  15.         {  
  16.             /** 
  17.              * 得到返回的数据 
  18.              */  
  19.             String jsonStr = new String(response.data);  
  20.             /** 
  21.              * 转化成对象 
  22.              */  
  23.             return Response.success(gson.fromJson(jsonStr, clazz), HttpHeaderParser.parseCacheHeaders(response));  
  24.         } catch (JsonSyntaxException e)  
  25.         {  
  26.             return Response.error(new ParseError(e));  
  27.         }  
  28.     }  
  29.   
  30.     @Override  
  31.     protected void deliverResponse(T response) {  
  32.   
  33.     }  
  34. }  

在parseNetworkResponse方法中使用Gson将response解析成Bean对象,并调用Response.success方法将数据包装后return出去。


接下来咱们看看StringRequest中的第二个方法——deliverResponse方法。

[java]  view plain  copy
  1. @Override  
  2.     protected void deliverResponse(String response) {  
  3.         mListener.onResponse(response);  
  4.     }  

具体实现更加简单,就是通过mListener将解析出来的response传递出去到给用户。至于deliverResponse方法是何时何地调用、怎么获取解析后的数据的,且看下篇——Volley源码分析,给各位看官慢慢道来。

咱们接着依葫芦画瓢来继续完成咱们的GsonRequest类。

[java]  view plain  copy
  1. /** 
  2.  * Created by leevi on 16/9/23. 
  3.  */  
  4. public class GsonRequest extends Request {  
  5.     private final Gson gson = new Gson();  
  6.     private final Class clazz;  
  7.     private final Response.Listener mListener;  
  8.     public GsonRequest(String url, Response.ErrorListener listener, Class clazz, Response.Listener listener1) {  
  9.         super(Method.GET, url, listener);//默认get请求  
  10.         this.clazz = clazz;  
  11.         mListener = listener1;  
  12.     }  
  13.   
  14.     @Override  
  15.     protected Response parseNetworkResponse(NetworkResponse response) {  
  16.         try  
  17.         {  
  18.             /** 
  19.              * 得到返回的数据 
  20.              */  
  21.             String jsonStr = new String(response.data);  
  22.             /** 
  23.              * 转化成对象 
  24.              */  
  25.             return Response.success(gson.fromJson(jsonStr, clazz), HttpHeaderParser.parseCacheHeaders(response));  
  26.         } catch (JsonSyntaxException e)  
  27.         {  
  28.             return Response.error(new ParseError(e));  
  29.         }  
  30.     }  
  31.   
  32.     @Override  
  33.     protected void deliverResponse(T response) {  
  34.         //将数据传递出去。  
  35.         mListener.onResponse(response);  
  36.     }  
  37. }  
至此,自定义GsonRequest就完成了,当我们使用GsonRequest发送请求时,我们就能在成功的回调中直接获取解析出来的Bean对象了。

用法如下:

[java]  view plain  copy
  1. GsonRequest request = new GsonRequest(url, new Response.ErrorListener() {  
  2.             @Override  
  3.             public void onErrorResponse(VolleyError error) {  
  4.   
  5.             }  
  6.         }, Bean.classnew Response.Listener() {  
  7.             @Override  
  8.             public void onResponse(Bean response) {  
  9.                 //获取到Bean对象  
  10.             }  
  11.         });  
  12.         RequestQueue requestQueue = Volley.newRequestQueue(this);  
  13.         requestQueue.add(request);  
是不是很简单?就是依葫芦画瓢,要弄清楚Volley源码中的运行机制的话,请期待下一篇——Volley源码解析。

你可能感兴趣的:(Volley详解之自定义volley请求)