一、概览
Volley 具有以下优势:
-
自动网络请求调度。
-
多个并发网络连接。
-
透明磁盘和具有标准 HTTP 缓存一致性的内存响应缓存。
-
支持请求优先级。
-
取消请求 API。您可以取消单个请求,也可以设置要取消的请求的时间段或范围。
-
可轻松自定义,例如自定义重试和退避时间。
-
强大的排序功能,让您可以轻松使用从网络异步提取的数据正确填充界面。
-
调试和跟踪工具。
Volley 不适用于下载大量内容的操作或流式传输操作,因为在解析过程中,Volley 会将所有响应存储在内存中。对于下载大量内容的操作,请考虑使用
等替代方法。DownloadManager
二、请求处理
2.1 发送请求
大体上讲,您可以通过创建 RequestQueue
并向其传递 Request
对象以使用 Volley。RequestQueue
管理用于运行网络操作、向缓存读写数据以及解析响应的工作器线程。请求负责解析原始响应,而 Volley 负责将已解析的响应调度回主线程以供传送。
Volley 始终在主线程上传送已解析的响应。在主线程上运行便于使用接收的数据填充界面控件,因为您可以直接从响应处理程序随意修改界面控件。对于库提供的许多重要语义(特别是与取消请求相关的语义)来说,这尤为重要。
final TextView textView = (TextView) findViewById(R.id.text);
// ...
// Instantiate the RequestQueue.
RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://www.google.com";
// Request a string response from the provided URL.
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// Display the first 500 characters of the response string.
textView.setText("Response is: "+ response.substring(0,500));
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
textView.setText("That didn't work!");
}
});
// Add the request to the RequestQueue.
queue.add(stringRequest);
调用 add()
时,Volley 会运行一个缓存处理线程和一个网络调度线程池。将请求添加到队列后,缓存线程会拾取该请求并对其进行分类:如果该请求可以通过缓存处理,系统会在缓存线程上解析缓存的响应,并在主线程上传送解析后的响应。如果该请求无法通过缓存处理,则系统会将其放置到网络队列中。第一个可用的网络线程会从队列中获取该请求,执行 HTTP 事务,在工作器线程上解析响应,将响应写入缓存,然后将解析后的响应发送回主线程以供传送。
请注意,阻塞 I/O 和解析/解码等开销大的操作都是在工作器线程上完成的。您可以添加来自任意线程的请求,但响应始终会在主线程上传送。
2.2 取消请求
需取消请求, Request
对象上调用 cancel()
。取消请求后,Volley 可以确保您的响应处理程序永远不会被调用。 一个标记对象与每个请求相关联。然后,使用该标记提供要取消的请求范围的所有请求。
public static final String TAG = "MyTag";
StringRequest stringRequest; // Assume this exists.
RequestQueue requestQueue; // Assume this exists.
// Set the tag on the request.
stringRequest.setTag(TAG);
// Add the request to the RequestQueue.
requestQueue.add(stringRequest);
@Override
protected void onStop () {
super.onStop();
if (requestQueue != null) {
requestQueue.cancelAll(TAG);
}
}