发送一个简单的 Request
在一个较高层次上,你可以使用 Volley 创建一个 RequestQueue
然后可以传递一个 Request
对象。RequestQueue
管理 worker threads(工作线程) 来操作网络,读取和写入 cache ,解析 response。
Requests 解析原始的 Responses 然后 Volley 会负责分发解析过的 response 到主线程
这节课描述了如何使用 Volley.newRequestQueue
便利方法来发送一个 Request,如果想自己配置一个 RequestQueue
,点击下节课,Setting up a RequestQueue 查看更多关于如何配置一个自己的 RequestQueue
。
这节课也描述了如何添加一个 Request 至 RequestQueue
和如何取消一个 Request。
添加 INTERNET 权限
为了使用 Volley,你必须添加 android.permission.INTERNET 权限到你的 App manifest 文件里。没有该权限,你的 App 无法连接到网络
使用 newRequestQueue
Volley 提供了一个配置 RequestQueue
的便利方法 Volley.newRequestQueue,内部使用默认的值和启动队列的自动操作。例如:
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() {
@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 总是在 main thread 回调当中发送 parsed Response, 运行在主线程中可以方便将接受到的数据与需要填充数据的 UI 进行对照,这样你就可以在响应处理类中直接自由的修改你的 UI 和数据的对照,但是要尤其注意该 library 中的重要语义,尤其是和取消 request 相关的。
查看 Settings up a RequestQueue 里的描述如何配置一个自己的 RequestQueue
而不是使用 Volley.newRequestQuenue 便利方法。
发送一个 Request
为了发送一个 request,你可以简单地构造一个然后调用 RequestQueue.add()
方法添加一个 request,就像上面所说的,一旦添加一个 request ,该 request 就会通过管道被移动,获得处理服务,然后解析原始的 response 最后发送该 response。
当你调用 add()
方法时,Volley 运行一个 cache 处理 thread 和维护一个网络调度 thread pool,当你添加一个 request 到队列时,该 request 会被 cache thread 接手并被筛选:如果该 request 可以被 cache 处理,那么这个 cached response 会在 cache thread 被解析然后这个 parsed response 会被发送到 main thread。如果这个 request 不能被 cache 处理,该 request 就会被放置到 network queue,第一个可用的 network thread 会从 queue 取出这个 request, 执行 HTTP 事务,在 work thread 中解析 response,将该 response 写入 cache 中,然后传递 parsed responsed 到 main thread 中
注意那些像 I/O 流,解码/解析 这些耗时的操作是在 work thread 中被执行的,你可以在任意的 thread 中添加一个 request,但是 responses 总是会在 main thread 中被传递。
图 1 说明了一个 request 的生命周期:
图 1.request 的生命周期
取消一个 request
可以调用需要被取消的 Request
对象的 cancel()
方法来取消该 request,一旦被取消,Volley 会保证你的 response 处理类相关回调不会被调用。在实际中意味着你可以在你的 Activity的 onStop 中取消你的 pending requests 并且你不需要在你的响应类中检查 getActivity()==null,不管 onSaveInstanceState() 是否已经被回调,或者其他类似这样的检查代码来回收你的 response 处理类。
为了利用这个优势,你通常必须跟踪所有 in-flight request 在适当的时间来取消它们。有一个更加简单的方法:你可以在每一个 request 上关联一个 tag 对象。你可以使用它们来取消一个范围内的 requests。例如,你可以使用 Activity 来标记所有与之相关的 request,然后从该 Activity 的 onStop 方法中调用 requestQueue.cancelAll(this)
。类似的,你可以标记在 ViewPager 各自的 tab 中标记所有的缩略图 request,然后在滑动时取消这些 request 来确保新 tab 中的 request 不会被另一个 tab 中的 request 所阻塞。
这里有一个使用一个 string 值作为 tag 的例子:
-
定义你的 tag 并添加到你的 request 中.
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 方法中取消所有标记为该 tag 的 request.
@Override protected void onStop () { super.onStop(); if (mRequestQueue != null) { mRequestQueue.cancelAll(TAG); } }
注意当你取消 request 时,如果你需要依赖你的 response 处理类来推出一个状态或者启动另一个进程,你需要注意这个。再一次说明,取消response 会导致你的 response 处理类相关回调不会被调用