转载请注明出处:http://blog.csdn.net/forevercbb/article/details/51286441
Volley是一个比较常见的网络请求库,可以简单的进行http通信,也可以用来加载网络上的图片。Volley比较小巧,因此本身自带的请求类型较少,但是具有很强的拓展性,可以方便的进行自定义,使用起来非常灵活。最近使用到一部分功能,将基本的使用进行分享,说是基本,就真的是很基本。另外,前排感谢郭霖大神的文章http://blog.csdn.net/guolin_blog/article/details/17482095提供的帮助。
StringRequest的使用
使用StringRequest首先需要获取一个RequestQueue对象,这是Volley的一个请求队列。
RequestQueue mQueue = Volley.newRequestQueue(context);
这个队列不必每次都创建一个,一般有两种使用,一种是在需要网络交互的Activity分别创建一个就可以了。另一种是在Application的子类创建一个,全局使用。比较推荐第二种做法,一是各个Activity之间的解耦,二是需要修改或者全局设置时较为方便。
然后再创建一个StringRequest对象如下:
StringRequest request = new StringRequest(url, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
//请求成功的处理
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
//请求失败的处理
}
});
这个内容相信大家都能理解,任何解释都显得苍白无力。最后将Request添加到RequestQueue里。
mQueue.add(stringRequest);
这样,就可以完成访问网络的请求了。当然需要访问网络的权限。
<uses-permission android:name="android.permission.INTERNET" />
Volley默认的请求类型是GET请求,而如果要发起POST请求的话,则需要声明请求类型,和提交参数。map的内容就是需要提交的参数。
StringRequest request = new StringRequest(Method.POST, url, listener, errorlistener){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> map = new HashMap<String, String>();
map.put("params1", "value1");
map.put("params2", "value2");
return map;
}
};
除了StringRequest之外,Volley还有JsonRequest、ImageRequest,用法几乎一毛一样。因此这里就不废话了。
Volley超时设置
Volley默认的超时时间为2.5秒,需要自定义的如下。TIMEOUT为自定义的超时时间。
request.setRetryPolicy(new DefaultRetryPolicy(TIMEOUT, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Volley的编码
Volley未提供转码的方法。可以通过重写parseNetworkResponse实现编码的设置。
protected Response<String> parseNetworkResponse(NetworkResponse response) {
String parsed;
try {
parsed = new String(response.data, "utf-8");
} catch (UnsupportedEncodingException var4) {
parsed = new String(response.data);
}
return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
}
查看Volley的源码,可以发现Volley对编码格式的设置规则为,如果response有指定编码格式的,则采用指定的编码格式,如果没有指定,则采用ISO-8859-1编码。源码如下。
public static String parseCharset(Map<String, String> headers) {
String contentType = (String)headers.get("Content-Type");
if(contentType != null) {
String[] params = contentType.split(";");
for(int i = 1; i < params.length; ++i) {
String[] pair = params[i].trim().split("=");
if(pair.length == 2 && pair[0].equals("charset")) {
return pair[1];
}
}
}
return "ISO-8859-1";
}