Volley是Ficus Kirpatrick在Gooogle I/O 2013发布的一个处理和缓存网络请求的库,能使网络通信更快,更简单,更健壮。volley适合小而快的数据传输,使用volley非常简单方便,而且可以自定义请求。遗憾的是volley并不提供使用文档(可能开发者觉得简单易用。。)但是随着使用者越来越多,volley的资料也就越来越多,作为一个Android开发新手,我总结了不少volley使用的技巧,希望能供大家借鉴并应用到项目中去。
一.简单的Volley请求获取Json数据
首先我们来熟悉一下最简单的Volley请求,使用volley请求服务器上的Json数据,先来看看代码,注释的很清楚,应该不难理解:
public void getJsonByVolley(){
//新建一个Volley请求队列,在方法最后用于将我们的Volley请求添加进去
RequestQueue requestQueue = Volley.newRequestQueue(this);
//我们的请求链接
String httpurl = "http://172.18.10.8:8080/CardServer/ws/stores";
//Volley方法JsonRequest 用于请求Json数据,也可以带Json参数提交服务器,
JsonRequest<JSONObject> jsonRequest = new JsonObjectRequest(Method.POST,httpurl, null,
new Response.Listener<JSONObject>() {
//请求成功的监听方法
@Override
public void onResponse(JSONObject response) {
Log.d(TAG, "response-------- " + response.toString());
}
}, new Response.ErrorListener() {
//请求失败的监听方法,在请求状态不是200的情况下,都会是ErrorListener来处理
@Override
public void onErrorResponse(VolleyError error) {
Log.d(TAG,"error-------- "+ error);
}
});
//把请求添加到请求队列中去
requestQueue.add(jsonRequest);
}
我们可以简单的认为,volley仅仅使用一个方法就可以实现我们需要的网络通信:
JsonRequest<JSONObject> quest = new JsonObjectRequest(method,url,jsonRequest,listener,errorListener);
其中第一个method,是设置我们的请求方式,可以使Method.POST,也可以是Method.GET
第二个参数url,就是我们要请求的请求地址
第三个参数JsonRequest可以是null,也可以是一个JsonObject,是我们可以带上JsonObject请求服务器
第四个参数Listener就是我们请求成功的监听方法,发送handler,或者直接操作UI都可以。
第五个参数errorListener就是在请求失败的情况下我们的监听方法,在这里也可以操作UI,后续关于这些的使用方法我都会一一总结出来。
二.带表单参数提交到服务器上
在实际开发中免除不了我们需要带参数到服务器上,当需要带参数的时候,我们可以通过重写public Map<String, String> getParams() {}方法 将参数传入Map里,这样Volley在处理请求的时候会自动带入Map参数,下面我使用一个开发中使用的实际案例,把意见反馈传入服务器,代码和注释如下:
public void newfeedback(){
String httpurl = "http://172.18.10.88:8080/CardServer/ws/feedback/createFeedback";
RequestQueue requestQueue = Volley.newRequestQueue(this);
StringRequest stringRequest = new StringRequest(Request.Method.POST,httpurl,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, "response ->------------- " + response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d(TAG, "----------------"+error);
}
}) {
@Override
public Map<String, String> getParams() {
//在这里设置需要post的参数
Map<String, String> map = new HashMap<String, String>();
map.put("userId", "1111");
map.put("title", "我觉得这个APP很不好用");
map.put("feedbackContent", "改进改善!!!!");
return map ;
}
};
requestQueue.add(stringRequest);
}
三.使用volley获取cookie.
在登陆注册的时候为了保证请求在同一个Session中,使用volley获取cookie,并取出sessionId,并在登陆请求的时候带上sessionId,我们可以重写protected Response<String> parseNetworkResponse(
NetworkResponse response) {}方法来获取cookie,代码如下:
/**
* 获取cookie
*/
private void getTelVolleyMa() {
RequestQueue requestQueue = Volley.newRequestQueue(this);
String JSONDataUrl = CscTools.getWSUrl() + "users/sendCode?tel=" + phone_num;
StringRequest stringrequest = new StringRequest(Request.Method.POST,
JSONDataUrl, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// TODO Auto-generated method stub
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError arg0) {
}
}) {
// 如何解析服务端设置的cookie
@Override
protected Response<String> parseNetworkResponse(
NetworkResponse response) {
Response<String> superResponse = super
.parseNetworkResponse(response);
Map<String, String> responseHeaders = response.headers;
String rawCookies = responseHeaders.get("Set-Cookie");
cookies = rawCookies.substring(0, rawCookies.indexOf(";"));
// String cookies = part1;
Log.d("sessionid", "sessionid----------------" + cookies);
return superResponse;
}
};
requestQueue.add(stringrequest);
}
其中cookies是一个全局变量
public static volatile String cookies;
在用户填写密码或者验证码之后,我们就可以通过下面这个方法把sessionId带到服务器上,通过重写getHeaders()方法,代码如下:
/**
* 登陆验证
*/
private void getTelVolley(final String isUrl) {
RequestQueue requestQueue = Volley.newRequestQueue(this);
Log.d("调试", "isUrl----------------" + isUrl);
String JSONDataUrl = null;
StringRequest stringrequest = new StringRequest(Request.Method.POST,
JSONDataUrl, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError arg0) {
}) {
// 如何上传cookie
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
if (cookies != null && cookies.length() > 0) {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("cookie", cookies);
Log.d("调试", "headers----------------" + headers);
return headers;
}
return super.getHeaders();
}
};
requestQueue.add(stringrequest);
}
通过上面这两个请求,我们就可以完成一个登陆流程了,是不是觉得很简单呢,后面还有第二篇关于volley的使用总结,因为是使用技巧,所以就不符上源码了,相信使用过volley的同学都能看的懂吧,如果你觉得的博客不错,请继续看Android网络通信框架Volley使用技巧汇总(二). ^_^