文章摘要
1、通过Volley 发送简单请求的案例
2、取消Volley请求
可以通过创建一个RequestQueue并传递Request对象来使用Volley。RequestQueue管理用于运行网络操作,读取和写入缓存以及解析响应的工作线程。 请求对原始响应进行解析,并且Volley负责将已解析的响应分派回主线程进行传递。
本文通过Volley 发送一个简单的请求,步骤如下:
一、添加Internet权限
使用Volley,你必须添加 android.permission.INTERNET权限您的应用程序的清单。没有这一点,你的应用程序将无法连接到网络。
<uses-permission android:name="android.permission.INTERNET" />
二、使用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直接从您的响应处理控制,但它是许多由库,特别是有关取消请求提供了重要的语义尤为关键。
附:运行效果
三、发送请求
要发送请求,只需构造一个请求,并使用add()将其添加到RequestQueue中,如上所示。一旦你添加了请求,它将通过管道移动,得到服务,并且它的原始响应被解析和传递。
- 1、当你调用add()时,Volley运行一个缓存处理线程和一个网络调度线程池。
- 2、当您向队列添加请求时,它由缓存线程获取并分类:如果请求可以从缓存服务,缓存响应将在缓存线程上解析,并且解析的响应将在主线程上传递。
- 3、如果请求无法从缓存服务,则将其放置在网络队列上。第一个可用的网络线程接收来自队列的请求,执行HTTP事务,解析工作线程上的响应,将响应写入缓存,并将解析的响应发回主线程进行传递。
请注意,诸如阻塞I / O和解析/解码等昂贵的操作在工作线程上完成。您可以从任何线程添加请求,但响应始终在主线程上传递。
- 图1示出了请求的声明周期
四、取消请求
要取消请求,请在Request对象上调用cancel()。一旦取消,Volley保证您的Response Handler程序将永远不会被调用,请求会从中释放。这在实践中意味着您可以在Activity的onStop()方法中取消所有待处理的请求,并且在来处理响应处理程序时不必对getActivity()== null进行检查,是否调用了onSaveInstanceState()、是否已调用其他释放资源等生命周期方法。
要利用此行为,您通常必须跟踪所有正在运行的请求,以便能够在适当的时间取消它们。有一个更简单的方法:您可以将标记对象与每个请求相关联。然后,您可以使用此标记来提供要取消的请求范围。例如,您可以使用他们代表的活动来标记所有请求,并从onStop()调用requestQueue.cancelAll(this)。同样,您可以使用其各自的选项卡在ViewPager选项卡中标记所有缩略图请求,并在滑动上取消以确保新标签未被来自另一个的请求所阻止。
这是一个使用标记的字符串值的示例:
- 1、定义你的标签,并把它添加到您的要求。
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);
- 2、在您的活动的onStop()方法,取消有这个标记的所有请求。
protected void onStop () {
super.onStop();
if (mRequestQueue != null) {
mRequestQueue.cancelAll(TAG);
}
}
注意:只是取消了请求Request,并不会取消Request Handler。
网友评论