編寫:kesenhoo - 原文:http://developer.android.com/training/volley/simple.html
使用 Volley 的方式是,創建一個 RequestQueue
並傳遞 Request
對象給它。RequestQueue
管理用來執行網絡操作的工作線程,從緩存中讀取數據,寫數據到緩存,並解析 Http 的響應內容。請求解析原始的響應數據,Volley 會把解析完的響應數據分發給主線程。
這節課會介紹如何使用 Volley.newRequestQueue
這個便捷的方法(建立一個請求隊列 RequestQueue
)來發送一個請求。在下一節課建立一個 RequestQueue中,會介紹如何自己建立一個 RequestQueue
。
這節課也會介紹如何添加一個請求到 RequesutQueue
以及如何取消一個請求。
為了使用Volley,你必須添加android.permission.INTERNET
權限到你的manifest文件中。沒有這個權限,你的app將無法訪問網絡。
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() {
@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控件,這樣你可以在響應的handler中輕鬆的修改UI,但是對於庫提供的一些其他方法是有些特殊的,例如與取消有關的。
關於如何創建你自己的請求隊列,而不是使用Volley.newRequestQueue方法,請查看建立一個請求隊列Setting Up a RequestQueue。
為了發送一個請求,你只需要構造一個請求並通過add()
方法添加到RequestQueue
中。一旦你添加了這個請求,它會通過隊列,得到處理,然後得到原始的響應數據並返回。
當你執行add()
方法時,Volley觸發執行一個緩存處理線程以及一系列網絡處理線程。當你添加一個請求到隊列中,它將被緩存線程所捕獲並觸發:如果這個請求可以被緩存處理,那麼會在緩存線程中執行響應數據的解析並返回到主線程。如果請求不能被緩存所處理,它會被放到網絡隊列中。網絡線程池中的第一個可用的網絡線程會從隊列中獲取到這個請求並執行HTTP操作,解析工作線程的響應數據,把數據寫到緩存中並把解析之後的數據返回到主線程。
請注意那些比較耗時的操作,例如I/O與解析parsing/decoding都是執行在工作線程。你可以在任何線程中添加一個請求,但是響應結果都是返回到主線程的。
下圖1,演示了一個請求的生命週期:
對請求Request對象調用cancel()
方法取消一個請求。一旦取消,Volley會確保你的響應Handler不會被執行。這意味著在實際操作中你可以在activity的onStop()
方法中取消所有pending在隊列中的請求。你不需要通過檢測getActivity() == null
來丟棄你的響應handler,其他類似onSaveInstanceState()
等保護性的方法裡面也都不需要檢測。
為了利用這種優勢,你應該跟蹤所有已經發送的請求,以便在需要的時候可以取消他們。有一個簡便的方法:你可以為每一個請求對象都綁定一個tag對象。然後你可以使用這個tag來提供取消的範圍。例如,你可以為你的所有請求都綁定到執行的Activity上,然後你可以在onStop()
方法執行requestQueue.cancelAll(this)
。同樣的,你可以為ViewPager中的所有請求縮略圖Request對象分別打上對應Tab的tag。並在滑動時取消這些請求,用來確保新生成的tab不會被前面tab的請求任務所卡到。
下面一個使用String來打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);
@Override
protected void onStop () {
super.onStop();
if (mRequestQueue != null) {
mRequestQueue.cancelAll(TAG);
}
}
當取消請求時請注意:如果你依賴你的響應handler來標記狀態或者觸發另外一個進程,你需要對此進行考慮。再說一次,response handler是不會被執行的。