Android 發(fā)送簡單的網(wǎng)絡(luò)請求

2018-08-02 17:44 更新

編寫: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è)請求。

1)Add the INTERNET Permission

為了使用Volley,你必須添加android.permission.INTERNET權(quán)限到你的manifest文件中。沒有這個(gè)權(quán)限,你的app將無法訪問網(wǎng)絡(luò)。

2)Use newRequestQueue

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。

3)Send a Request

為了發(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è)請求的生命周期:


4)Cancel a Request

對請求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的例子:

  1. 定義你的tag并添加到你的請求任務(wù)中。
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);
  1. 在activity的onStop()方法里面,取消所有的包含這個(gè)tag的請求任務(wù)。
@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í)行的。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)