這次課教你:
- 添加INTENET權限
- 使用newRequestQueue
- 發送一個request
- 取消一個request
高級點說,你可以使用Volley,通過創建一個RequestQueue
然后傳遞Request
對象。RequestQueue
管理著工作線程,來執行網絡操作、讀寫緩存和解析響應的數據。request做原始響應的解析和調度,Volley負責將解析后的響應發送到交付的主線程中。
本教程描述如何通過Volley.newRequestQueue
這個如此方便的方法來建立一個RequestQueue
,發送一個請求。查看下一個教程:Setting Up a RequestQueue來了解如何自建RequestQueue
。
本教程也描述了如何添加一個request到RequestQueue
和取消一個request。
添加INTENET權限
為了使用Volley,你必須添加權限android.permission.INTERNET
到你的app的清單文件中。否則,你的app無法訪問網絡。
使用newRequestQueue
Volley提供了一個便利的方法Volley.newRequestQueue
來建立一個RequestQueue
,使用默認值啟動隊列。比如:
final TextView mTextView = (TextView) findViewById(R.id.text);
...
// 初始化請求隊列.
RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://www.google.com";
// 從提供的URL中請求一個字符串響應.
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// 顯示響應字符串的前500個字符
mTextView.setText("Response is: "+ response.substring(0,500));
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
mTextView.setText("That didn't work!");
}
});
// 添加請求到請求隊列中.
queue.add(stringRequest);
Volley總是在主線程傳遞解析后的響應數據。跑在主線程可以很方便地填入接收到的數據到UI控件中,因為你可以直接從響應處理器(response handler)中自由地修改UI控件,不僅如此,它在庫中還具有更重要的用意,特別是跟取消request相關。
查看Setting Up a RequestQueue來了解如何自建RequestQueue
而不是使用Volley.newRequestQueue
。
發送一個request
為了發送一個請求,你只需要簡單地構造一個request并使用add()
方法添加到RequestQueue
中即可,如上所述。一旦你添加了request,它會通過管道,開始服務并有了獨自的能被解析和傳遞的原始響應數據。
當你調用add()
,Volley運行了一個cache處理線程和一個網絡分發線程池。當你添加了一個request到隊列中,它會由cache線程獲取并分類:如果request能夠被cache服務,那么緩存的響應會在cache線程被解析并發送到主線程。如果request不能被cache服務,它會被放置到網絡隊列(network queue)。第一個可用的network線程從隊列中獲取request,執行HTTP事務,在工作線程解析響應,寫入響應到cache中,然后發送解析后的響應數據到主線程中。
提醒:昂貴的操作(譯注:指耗時或耗CPU的操作),比如會引發中斷的I/O和解析/解碼都是在工作線程執行的。你可以從任意線程添加請求,但是響應總是在主線程發送的。
圖1 闡明了request的生命周期
取消一個request
為了取消一個rquest,你可以調用Request
對象的cancle()
方法。一旦取消,Volley會保證你的響應處理器(response handler)不會被調用。在實踐中意味著你可以在activity的onStop()
方法中取消所有將要執行的request,而不必到處檢查getActivity() == null
、是否onSaveInstanceState()
被調用了或者其它檢查性的樣板代碼,這些代碼把response handler都搞亂了。
為了利用這個行為并在合適的時候取消request,經典的方法是追蹤所有運行中的request。然而還有一個更簡單的方法:你可以給每個request附帶一個tag對象,這樣你就可以使用tag來提供一個request作用域(譯注:所有的request都可以通過tag操作)供取消。例如,你可以使用創建了request的Activity給每個request打tag,并在onStop()
中調用requestQueue.cancelAll(this)
。同理,你可以給ViewPager標簽中的各自的所有縮略圖(thumbnail image)請求打tag,并且在快速切換時取消request來保證新的標簽(tab)不會被另外一個標簽的請求所攔截。
下面的例子使用一個string值作為tag:
1.定義tag并添加到request中。
public static final String TAG = "MyTag";
StringRequest stringRequest; // 假定存在
RequestQueue mRequestQueue; // 假定存在
// 給請求打tag(標識)
stringRequest.setTag(TAG);
// 添加請求到請求隊列中
mRequestQueue.add(stringRequest);
2.在activity的onstop()
方法中取消所有帶該tag的request。
@Override
protected void onStop () {
super.onStop();
if (mRequestQueue != null) {
mRequestQueue.cancelAll(TAG);
}
}
你應該關心何時取消request。如果你依賴于response handler來更新一個狀態或者開始一個方法,那么你要對此負責。response handler不會被再次調用。
項目源碼下載 :點擊下載
系列索引
- 【譯】Volley官方文檔五:實現一個自定義的Request
- 【譯】Volley官方文檔四:構建一個標準的Request
- 【譯】Volley官方文檔三:建立一個RequestQueue
- 【譯】Volley官方文檔二:發送一個簡單的request
- 【譯】Volley官方文檔一:使用Volley傳遞網絡數據
更新記錄:
- 2016年03月21日:添加了系列索引
- 2016年3月20號
- 修正了一些翻譯錯誤
- 翻譯了代碼中的注釋
- 添加了原文鏈接
- 添加了源碼