自定义volley框架StringRequest类
——一个方法发送各种请求(get post 参数 cookie)
这篇博客的作用是使用volley框架的时候,为大家提供一个自定义的StringRequest类,也就是手动写一个StringRequest子类,这个子类可以实现的功能有发送get请求、发送post请求(有参、无参)、发送携带cookie的请求。
一、用StringRequest类实现各种请求的发送
在提供这个自定义类之前,我们先来回顾一下使用volley框架StringRequest类如果实现这些功能。
volley框架中的StringRequest类的作用是发送一个请求,获得服务端的字符串数据。使用上主要分两步:
(一)创建出mStringRequest对象
有两个重载的构造方法:
构造方法1:
StringRequest:StringRequest(
String url //参数1:请求时使用的url
,Listener<String> listener //参数2:请求成功回调的接口对象
,ErrorListener errorListener)//参数3:请求错误回调的接口对象
这个方法构造出对象后,调用下面(二)(三)两步将请求对象添加到请求队列中,可以让我们发送一个get请求,在回调对象重写的方法中实现我们自己的业务。
另外还有一个重载的构造方法:
构造方法2:
StringRequest:StringRequest(
intmethod //请求的方式
, String url
, ErrorListener errorListener)
比较可见,构造方法2比方法1多了一个int method参数,取值为Request内部接口Method中int属性值,包括GET、POST、PUT等。如果要发送get请求,就使用Request.(I)Method.GET
如果要发送post请求,那么就使用Request.(I)Method.POST
如果发送post请求时,需要携带参数,那么需要重写父类的getParams()方法来传递参数
Map<String, String>:Request.getParams();
在短连接中,为了保存连接状态,客户端收到服务端发来的数据之后,需要将String cookie保存下来,下一次发送请求的时候携带上。至于说,Stringcookie如何获取,我们另一篇文章再说,这里只说如果携带。
假如我们需要在发送请求的时候携带String cookie,那么还需要重写父类的getHeaders()方法。
Map<String,String>:Request.getHeaders()
@Override
publicMap<String, String> getHeaders() throws AuthFailureError {
Map<String,String> map = new HashMap<String, String>();
if(cookie != null) {
map.put("Cookie",cookie);
}
returnmap;
}
(二)创建请求队列对象
代码如下:
//创建请求队列对象开始
RequestQueue:Volley.newRequestQueue(Contextcontext);
//创建请求队列对象结束
如果程序中请求多次,为了节省资源,这句代码可以写在程序的SubApplication中,并且使用单例模式,可以减少对象创建的数量。
(三)将mStringRequest对象添加到请求队列mStringRequest中代码如下:
//添加到请求队列开始
Request:mRequestQueue.add(Request request);
//添加到请求队列结束
二、用自定义StringRequest类实现各种请求的发送
通过以上的分析,我们可以看到,我们发送get请求需要使用构造方法1,发送post请求,使用构造方法2,发送post请求参数需要重写getParams()方法,发送cookie又需要重写getHeaders()方法,十分繁琐。
既然不同的请求,需要重写不同的方法,那么我们考虑写一个StringRequest子类,通过添加参数来区分不同的请求类型,在重写方法中判断参数值来确定是否重写,如何重写。
这个类我们命名为StringRequestUtil
代码如下:
packagecom.wujc.e_park.util;
importjava.util.HashMap;
importjava.util.Map;
importcom.android.volley.AuthFailureError;
importcom.android.volley.Response.ErrorListener;
importcom.android.volley.Response.Listener;
importcom.android.volley.toolbox.StringRequest;
public classStringRequestUtil extends StringRequest {
private Map<String,String> mapParams;
private String cookie;
/**
* 构建一个StringRequest请求
* @param method 请求的方式,取值为Request的常量,
如Request.Method.GET
* @param url 请求url
* @paramlistener 请求成功的回调监听
* @paramerrorListener 请求错误的回调
* @parammapParams 参数,没有参数,给null
* @param cookie 需要携带的cookie,不需要给null
*/
public StringRequestUtil(int method,
String url,
Listener<String>listener,
ErrorListener errorListener,
Map<String,String> mapParams,
String cookie) {
super(method,url, listener, errorListener);
this.mapParams =mapParams;
this.cookie = cookie;
}
@Override
public Map<String,String> getHeaders() throws AuthFailureError {
Map<String, String> map = newHashMap<String,
String>();
if (cookie != null) {
map.put("Cookie", cookie);
}
return map;
}
@Override
protectedMap<String, String> getParams() throwsAuthFailureError {
return mapParams;
}
}
有了这个自定义类之后,不管发送什么样的请求,一个构造方法
StringRequestUtil(
int method,
String url,
Listener<String> listener,
ErrorListener errorListener,
Map<String, String> mapParams,
String cookie)
就能解决,是不是很方便呀
关于volley框架的更多介绍,可以参考【郭霖】博客
http://blog.csdn.net/guolin_blog/article/details/17482095/
Android Volley完全解析(一),初识Volley的基本用法
http://blog.csdn.net/sinyu890807/article/details/17482165
Android Volley完全解析(二),使用Volley加载网络图片
http://blog.csdn.net/sinyu890807/article/details/17612763
Android Volley完全解析(三),定制自己的Request
http://blog.csdn.net/sinyu890807/article/details/17656437
Android Volley完全解析(四),带你从源码的角度理解Volley
本文原创,版权所有,转载请标明出处,欢迎技术交流,严禁篡改抄袭。
wujc562@163.com