W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
編寫:kesenhoo - 原文:http://developer.android.com/training/volley/simple.html
使用 Volley 的方式是,創(chuàng)建一個(gè) RequestQueue
并傳遞 Request
對象給它。RequestQueue
管理用來執(zhí)行網(wǎng)絡(luò)操作的工作線程,從緩存中讀取數(shù)據(jù),寫數(shù)據(jù)到緩存,并解析 Http 的響應(yīng)內(nèi)容。請求解析原始的響應(yīng)數(shù)據(jù),Volley 會(huì)把解析完的響應(yīng)數(shù)據(jù)分發(fā)給主線程。
這節(jié)課會(huì)介紹如何使用 Volley.newRequestQueue
這個(gè)便捷的方法(建立一個(gè)請求隊(duì)列 RequestQueue
)來發(fā)送一個(gè)請求。在下一節(jié)課建立一個(gè) RequestQueue中,會(huì)介紹如何自己建立一個(gè) RequestQueue
。
這節(jié)課也會(huì)介紹如何添加一個(gè)請求到 RequesutQueue
以及如何取消一個(gè)請求。
為了使用Volley,你必須添加android.permission.INTERNET
權(quán)限到你的manifest文件中。沒有這個(gè)權(quán)限,你的app將無法訪問網(wǎng)絡(luò)。
Volley提供了一個(gè)簡便的方法:Volley.newRequestQueue
用來為你建立一個(gè)RequestQueue
,使用默認(rèn)值,并啟動(dòng)這個(gè)隊(duì)列。例如:
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總是將解析后的數(shù)據(jù)返回至主線程中。在主線程中更加合適使用接收到的數(shù)據(jù)用來操作UI控件,這樣你可以在響應(yīng)的handler中輕松的修改UI,但是對于庫提供的一些其他方法是有些特殊的,例如與取消有關(guān)的。
關(guān)于如何創(chuàng)建你自己的請求隊(duì)列,而不是使用Volley.newRequestQueue方法,請查看建立一個(gè)請求隊(duì)列Setting Up a RequestQueue。
為了發(fā)送一個(gè)請求,你只需要構(gòu)造一個(gè)請求并通過add()
方法添加到RequestQueue
中。一旦你添加了這個(gè)請求,它會(huì)通過隊(duì)列,得到處理,然后得到原始的響應(yīng)數(shù)據(jù)并返回。
當(dāng)你執(zhí)行add()
方法時(shí),Volley觸發(fā)執(zhí)行一個(gè)緩存處理線程以及一系列網(wǎng)絡(luò)處理線程。當(dāng)你添加一個(gè)請求到隊(duì)列中,它將被緩存線程所捕獲并觸發(fā):如果這個(gè)請求可以被緩存處理,那么會(huì)在緩存線程中執(zhí)行響應(yīng)數(shù)據(jù)的解析并返回到主線程。如果請求不能被緩存所處理,它會(huì)被放到網(wǎng)絡(luò)隊(duì)列中。網(wǎng)絡(luò)線程池中的第一個(gè)可用的網(wǎng)絡(luò)線程會(huì)從隊(duì)列中獲取到這個(gè)請求并執(zhí)行HTTP操作,解析工作線程的響應(yīng)數(shù)據(jù),把數(shù)據(jù)寫到緩存中并把解析之后的數(shù)據(jù)返回到主線程。
請注意那些比較耗時(shí)的操作,例如I/O與解析parsing/decoding都是執(zhí)行在工作線程。你可以在任何線程中添加一個(gè)請求,但是響應(yīng)結(jié)果都是返回到主線程的。
下圖1,演示了一個(gè)請求的生命周期:
對請求Request對象調(diào)用cancel()
方法取消一個(gè)請求。一旦取消,Volley會(huì)確保你的響應(yīng)Handler不會(huì)被執(zhí)行。這意味著在實(shí)際操作中你可以在activity的onStop()
方法中取消所有pending在隊(duì)列中的請求。你不需要通過檢測getActivity() == null
來丟棄你的響應(yīng)handler,其他類似onSaveInstanceState()
等保護(hù)性的方法里面也都不需要檢測。
為了利用這種優(yōu)勢,你應(yīng)該跟蹤所有已經(jīng)發(fā)送的請求,以便在需要的時(shí)候可以取消他們。有一個(gè)簡便的方法:你可以為每一個(gè)請求對象都綁定一個(gè)tag對象。然后你可以使用這個(gè)tag來提供取消的范圍。例如,你可以為你的所有請求都綁定到執(zhí)行的Activity上,然后你可以在onStop()
方法執(zhí)行requestQueue.cancelAll(this)
。同樣的,你可以為ViewPager中的所有請求縮略圖Request對象分別打上對應(yīng)Tab的tag。并在滑動(dòng)時(shí)取消這些請求,用來確保新生成的tab不會(huì)被前面tab的請求任務(wù)所卡到。
下面一個(gè)使用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);
}
}
當(dāng)取消請求時(shí)請注意:如果你依賴你的響應(yīng)handler來標(biāo)記狀態(tài)或者觸發(fā)另外一個(gè)進(jìn)程,你需要對此進(jìn)行考慮。再說一次,response handler是不會(huì)被執(zhí)行的。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: