可以通过创建一个RequestQueue并传递Request对象来使用Volley。RequestQueue管理工作线程,这些线程用于运行网络操作、读取和写入缓存和解析响应。Request对原始响应进行解析,并且Volley负责将已解析的响应分派回主线程。
本文介绍如何使用Volley.newRequestQueue的便捷方法发送请求,该方法为您这是了一个RequestQueue。本文还介绍了如何向RequestQueue添加请求和取消请求。
添加INTERNET权限
使用Volley,需要将android.permission.INTERNET权限添加到app的清单文件中。否则app将不能连接网络。
使用 newRequestQueue
Volley提供了一个便捷的方法Volley.newRequestQueue,它使用默认值创建一个RequestQueue,并启动队列。例如:
final TextView mTextView = (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.
mTextView.setText("Response is: "+ response.substring(0,500));
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
mTextView.setText("That didn't work!");
}
});
// Add the request to the RequestQueue.
queue.add(stringRequest);
Volley总是在主线程上提解析响应。在主线程上运行可以方便的使用接收到的数据填充UI控件,因此可以直接从响应的处理程序中自由的修改UI控件。同时这对于本库提供的许多主要特性也很重要,特别是与取消请求有关。
发送请求
要发送一个请求,只需要构建一个请求,并使用RequestQueue的add()方法将其添加到RequestQueue中,如上所示。一旦添加了一个请求,它通过管道移动、得到服务,并拥有自己的已投递和解析的响应。
当调用add()时,Vollley运行一个缓存处理线程和一个网络调度线程池。当向队列添加请求时,它由缓存线程拾取并分类:如果请求可以被缓存处理,那么缓存响应就在缓存线程中被解析并且解析后的响应被传递到主线程。如果请求不能被缓存处理,他被放置在网络队列中。第一个有效的网络线程从队列中获取请求,执行HTTP事务,并在工作线程中解析响应,将响应写入缓存,然后将解析过的响应送回主线程被传递。
请注意,耗时操作(如阻塞I/O和解析/解码)是在工作线程上完成的。可以在任何线程中添加请求,但是响应始终在主线程上传递。
要取消一个请求,需要在Request对象上调用cancel()。一旦被取消,Volley保证响应处理程序永远不会被调用。这在实践中意味着可以在activity的onStop()方法中取消所有待处理的请求并且不必在响应处理程序中检查getActivity()==null。
要利用此行为,您通常必须跟踪所有正在运行的请求,以便能够在适当的时间取消它们。有一个更简单的方法:可以将标记对象与每个请求相关联。然后,可以使用此标签来提供要取消的请求范围。例如,可以标记Activity中的所有请求,并在onStop()中调用requestQueue.cancelAll(this)。同样,可以使用相应的标签标记ViewPager一个标签中的所有缩略图请求,并在滑动时取消这些request以确保新标签不被另一个标签的请求阻塞。
下面是使用字符串标签的例子:
定义tag并将其添加给请求。
public static final String TAG = "MyTag"; StringRequest stringRequest; // Assume this exists. RequestQueue mRequestQueue; // Assume this exists.
// Set the tag on the request. stringRequest.setTag(TAG);
// Add the request to the RequestQueue. mRequestQueue.add(stringRequest);
在Activity的onStop()方法中,取消有此标签的所有请求。
@Override protected void onStop () { super.onStop(); if (mRequestQueue != null) { mRequestQueue.cancelAll(TAG); } }
取消请求时请小心。如果您依赖于您的响应处理程序来推进状态或启动另一个进程,则需要考虑这一点。