一、出现的原因
在volley出现以前,android开发者的网络请求代码和方式纷繁复杂,又不容易维护。
二、特点
简化了Http网络请求过程。
三、注意的地方
volley不适合大文件的上传和下载操作,当然也包括视频流操作。
四、volley的优势
- 开发超快的android的网络应用。
- 帮你在后台并行发送http请求并管理发送请求的线程。
- 给你提供流畅的同时同步的运行请求的方式。
- 有内置的JSON解析响应再返回给你。
- 可以为所有请求设置优先级。
- 为当网络服务器错误引发的请求超时和真正的错误情况提供了重发机制。
- 流畅的请求取消。
- 提供图片缓存功能。图片批量下载。
- 流畅地为你提供你自己实现的缓存机制。
- 你可以整合你自己的HTTPStack(用来处理SSL 连接、小量请求)
- 有效的内置缓存-控制以处理回应缓存
- 可供调试的请求追踪
- Excels以回应的方式返回给你
五、常用方式
1、整合volley到你的项目
导入volley.jar到你的项目libs文件中并引用。
常用类:
- RequestQueue
携带请求并分发的队列,它工作在工作线程。若有缓存,它会从缓存取得数据返回到UI线程。
- Request
所有和http相关的网络请求都是由这个类创建的。它携带着http所需要的主要参数,像方法类型-GET, POST, PUT, DELETE
URL
Request data (HTTP Body)
Successful Response Listener
Error Listener
Volley提供了2个特定的请求的实现:
JsonObjectRequest
StringRequest
2、初始化RequestQueue
/*
*
*说明:传入一个上下文,可以是应用上下文,也可以是活动上下文,建议使用前*者。
*/
mVolleyQueue = Volley.newRequestQueue(this);
3、JsonObjectRequest
/*
*
*说明:虽然这段代码没有表示,但是要说这种请求的Content-Type值总是*application/json。volley为你将服务端返回的数据解析成jsonobject直*接返回给你。
*/
String url = "<SERVER_API>";
JsonObjectRequest jsonObjRequest = new JsonObjectRequest(Request.Method.GET,
url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
mVolleyQueue.add(jsonObjRequest);
4、StringRequest(GET和POST请求示例)
get请求方式
/*
*
*说明:请求代码和方式与上一个几乎相似。volley为你将服务端返回的数据解析成String类型后返回给你。
*/
String url = "<SERVER-API>";
StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
mVolleyQueue.add(stringRequest);
post请求方式
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
String httpurl = "url";
StringRequest stringRequest = new StringRequest(Request.Method.POST,httpurl,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
LogUtil.e(MainActivity.this, "volley请求成功!");
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
LogUtil.e(MainActivity.this, "volley请求失败!");
}
}) {
@Override
protected Map<String, String> getParams() {
//在这里设置需要post的参数
Map<String, String> map = new HashMap<String, String>();
map.put("key1", "value1");
map.put("key2", "value2");
return map;
}
};
requestQueue.add(stringRequest);
5、自定义Request
你可以自定义Request并使用你自己的java bean作为回应的参数,就像上面的String和JsonObject类。
原理:借助一个json数据转换工具类(gson、fastjson等)将服务端返回的数据解析成你想要作为返回的对象。
/*
*说明:这是使用gson来自定义请求类的一个例子。你需要在项目中导入gson.jar包。
*
*/
public class GsonRequest<T> extends Request<T>{
private Gson mGson;
public GsonRequest(int method, String url, Class<T> cls, String requestBody, Listener<T> listener,
ErrorListener errorListener) {
super(method, url, errorListener);
mGson = new Gson();
}
@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
T parsedGSON = mGson.fromJson(jsonString, mJavaClass);
return Response.success(parsedGSON,
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JsonSyntaxException je) {
return Response.error(new ParseError(je));
}
}
}
/*
*这是使用自定义请求类来请求数据
*/
gsonObjRequest = new GsonRequest<FlickrResponsePhotos>(Request.Method.GET, url,
FlickrResponsePhotos.class, null, new Response.Listener<FlickrResponsePhotos>() {
@Override
public void onResponse(FlickrResponsePhotos response) {
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
mVolleyQueue.add(gsonObjRequest);
6、图片下载
7、SSL连接
8、多部分请求
9、增加(http)头
10、处理错误码
11、取消请求
12、为请求设置优先级
13、重发机制
14、回应缓存
15、在adb logcat中启用调试volley