在做项目时由于我们请求的数据量并不是很大,所以一直使用的都是Volley进行HTTP请求。
使用Volley的方法很简单,具体请参考郭神(http://blog.youkuaiyun.com/guolin_blog/article/details/17482095)。
因为项目在很多地方都需要进行Http请求。我将Volley的请求进行了封装,主要分为下面几个部分:
1.通过单例模式获取请求队列的对象(RequestQueue);
2.写了一个请求的父类,主要方法有封装url和参数,生成全新的带参数的url地址,还有就是将请求的request加入到请求队列中。
3.接口回调,包括获取成功和失败的回调。
4.封装Volley的StringRequest,JSonObjectRequest以及JsonArrayRequest的get以及post方法。
具体的我就上代码了。
(1)通过单例模式获取RequestQueue对象
/**
* Volley全局管理类
* 通过单例模式获取请求队列
* Created by wyj on 2017/7/14.
*/
public class GlobalVolley {
private static RequestQueue mRequestQueue;
/**
* 获取Volley请求队列
* @param mContext 上下文
* @return 请求队列对象
*/
public static RequestQueue getInstance(Context mContext){
if (mRequestQueue == null){
mRequestQueue = Volley.newRequestQueue(mContext);
}
return mRequestQueue;
}
}
/**
* Volley请求基类
* Created by wyj on 2017/7/14.
*/
public class BaseVolleyRequest<T> {
private static final String TAG = "BaseVolleyRequest";
private static final String DEFAULT_PARAMS_ENCODING = "UTF-8";
private Context mContext;
private RequestQueue mRequestQueue;
/**
* 构造方法 初始化请求队列
*
* @param mContext
*/
public BaseVolleyRequest(Context mContext) {
this.mContext = mContext;
mRequestQueue = GlobalVolley.getInstance(mContext);
}
/**
* 将url和参数生成新的url
*
* @param url 请求地址,不带参数
* @param params 请求参数集合
* @return 带参数的url
*/
public String createGetUrlWithParams(String url, Map<String, String> params) {
String newUrl = "";
if (params != null) {
StringBuffer mStringBuffer = new StringBuffer(url);
if (!url.contains("?")) {
mStringBuffer.append("?");
}
for (Map.Entry<String, String> map : params.entrySet()) {
String key = map.getKey();
String value = "";
if (map.getValue() == null) {
value = "";
} else {
value = map.getValue();
}
mStringBuffer.append(key);
mStringBuffer.append("=");
try {
value = URLEncoder.encode(value, DEFAULT_PARAMS_ENCODING);
mStringBuffer.append(value);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
mStringBuffer.append("&");
}
// 删除最后一个&符号
mStringBuffer.deleteCharAt(mStringBuffer.length() - 1);
newUrl = mStringBuffer.toString();
Log.e(TAG, "请求的新地址:"+newUrl );
}
return newUrl;
}
/**
* 将请求添加到队列中
* @param request 请求
*/
public void addRequest(Request request){
mRequestQueue.add(request);
}
}
(3)StringRequest的封装
**
* 字符串、文本请求封装类
* Created by wyj on 2017/7/14. */
public class StringRequestVolley extends BaseVolleyRequest {
/**
* 构造方法 初始化请求队列
*
* @param mContext
*/
public StringRequestVolley(Context mContext) {
super(mContext);
}
/**
* Stringrequest的get请求,此方法中的url带参数
* @param url 请求地址
* @param listener 回调对象
*/
public void StringRequstGet(String url, final CallBackListener<String> listener){
StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
listener.onSuccessResponse(s);
}
},new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError volleyError) {
listener.onErrorResponse(volleyError);
}
});
this.addRequest(request);
}
/**
* get请求,带参数,url中无具体参数
* @param url 请求url
* @param params 请求url的参数
* @param listener 请求回调
*/
public void StringRequestGet(String url, Map<String,String> params,CallBackListener<String> listener){
// 获取新的url,将参数拼进url中
String newUrl = this.createGetUrlWithParams(url,params);
this.StringRequstGet(newUrl, listener);
}
/**
* post请求
* @param url 请求的url
* @param params 具体参数
* @param listener 请求回调
*/
public void StringRequestPost(String url, final Map<String,String> params, final CallBackListener<String> listener){
StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
listener.onSuccessResponse(s);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
listener.onErrorResponse(volleyError);
}
}){
// 添加post参数
protected Map<String, String> getParams() throws AuthFailureError {
return params;
}
};
this.addRequest(request);
}
}
/**
* json对象请求方法封装
* Created by wyj on 2017/7/14.
*/
public class JsonObjectRequestVolley extends BaseVolleyRequest {
/**
* 构造方法 初始化请求队列
*
* @param mContext
*/
public JsonObjectRequestVolley(Context mContext) {
super(mContext);
}
/**
* get请求,url带参数
* @param url
* @param listener
*/
public void jsonObjectGet(String url, final CallBackListener<JSONObject> listener){
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
listener.onSuccessResponse(jsonObject);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
listener.onErrorResponse(volleyError);
}
});
this.addRequest(request);
}
/**
* get请求,带参数
* @param url
* @param params
* @param listener
*/
public void jsonObjectGet(String url, Map<String,String> params,CallBackListener<JSONObject> listener){
String newUrl = this.createGetUrlWithParams(url,params);
jsonObjectGet(newUrl, listener);
}
/**
* post 请求带参数
* @param url
* @param params
* @param listener
*/
public void jsonObjectPost(String url, final Map<String,String> params, final CallBackListener<JSONObject> listener){
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
listener.onSuccessResponse(jsonObject);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
listener.onErrorResponse(volleyError);
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return params;
}
};
this.addRequest(request);
}
}
(4)JsonArrayRequest的封装
/**
* JsonArray请求封装类
* Created by wyj on 2017/7/14.
*/
public class JsonArrayRequestVolley extends BaseVolleyRequest {
/**
* 构造方法 初始化请求队列
*
* @param mContext
*/
public JsonArrayRequestVolley(Context mContext) {
super(mContext);
}
/**
* json数组Get请求
* @param url 请求地址
* @param listener 接口回调
*/
public void jsonArrayGet(String url, final CallBackListener listener){
JsonArrayRequest request = new JsonArrayRequest(url, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray jsonArray) {
listener.onSuccessResponse(jsonArray);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
listener.onErrorResponse(volleyError);
}
});
this.addRequest(request);
}
/**
* 带参数的get请求
* @param url
* @param params
* @param listener
*/
public void jsonArrayGet(String url, Map<String,String> params,CallBackListener listener){
String newUrl = this.createGetUrlWithParams(url,params);
jsonArrayGet(newUrl,listener);
}
public void jsonArrayPost(String url, final Map<String,String> params, CallBackListener listener){
JsonArrayRequest request = new JsonArrayRequest(url, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray jsonArray) {
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return params;
}
};
this.addRequest(request);
}
}
接口回调
/**
* 接口回调
* Created by wyj on 2017/7/14.
*/
public interface CallBackListener<T> {
// 请求成功的回调
void onSuccessResponse(T response);
// 请求失败的回调
void onErrorResponse(VolleyError error);
}
测试使用,我用的是聚合数据进行天气获取
StringRequestVolley volley = new StringRequestVolley(this);
volley.StringRequestGet(url, params, new CallBackListener<String>() {
@Override
public void onSuccessResponse(String response) {
Log.e(TAG, "onSuccessResponse:"+response );
Toast.makeText(MainActivity.this,response,Toast.LENGTH_LONG).show();
}
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this,error.getMessage(),Toast.LENGTH_LONG).show();
}
});
特别注意:如果post请求对数据有顺序要求的话,请使用LinkedHashMap,它可以保证put进的数据和获取的数据顺序一致。