自定义volley框架StringRequest类 ——个方法发送各种请求(get post 参数 cookie)

时间:2022-12-29 13:27:38


自定义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

, Listener<String> listener

, 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<StringString>: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;
}

 

(二)创建请求队列对象


代码如下:


//创建请求队列对象开始

        RequestQueueVolley.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