Volley傳送簡單的網路請求(Sending a Simple Request)

銳湃發表於2015-08-12

編寫:kesenhoo - 原文:http://developer.android.com/training/volley/simple.html

使用Volley的方式是,你通過建立一個RequestQueue並傳遞Request物件給它。RequestQueue管理用來執行網路操作的工作執行緒,從Cache中讀寫資料,並解析Http的響應內容。Requests執行raw responses的解析,Volley會把響應的資料分發給主執行緒。

這節課會介紹如何使用Volley.newRequestQueue這個建立請求佇列RequestQueue的方法來傳送一個請求,在下一節課建立一個請求佇列Setting Up a RequestQueue中會介紹你自己如何建立一個請求佇列。

這節課也會介紹如何新增一個請求到RequesutQueue以及如何取消一個請求。

1)Add the INTERNET Permission

為了使用Volley,你必須新增android.permission.INTERNET許可權到你的manifest檔案中。沒有這個許可權,你的app將無法訪問網路。

2)Use newRequestQueue

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

3)Send a Request

為了傳送一個請求,你只需要構造一個請求並通過add()方法新增到RequestQueue中。一旦你新增了這個請求,它會通過佇列,得到處理,然後得到原始的響應資料並返回。

當你執行add()方法時,Volley觸發執行一個快取處理執行緒以及一系列網路處理執行緒。當你新增一個請求到佇列中,它將被快取執行緒所捕獲並觸發:如果這個請求可以被快取處理,那麼會在快取執行緒中執行響應資料的解析並返回到主執行緒。如果請求不能被快取所處理,它會被放到網路佇列中。網路執行緒池中的第一個可用的網路執行緒會從佇列中獲取到這個請求並執行HTTP操作,解析工作執行緒的響應資料,把資料寫到快取中並把解析之後的資料返回到主執行緒。

請注意那些比較耗時的操作,例如I/O與解析parsing/decoding都是執行在工作執行緒。你可以在任何執行緒中新增一個請求,但是響應結果都是返回到主執行緒的。

下圖1,演示了一個請求的生命週期:

volley-request

4)Cancel a Request

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

  1. 定義你的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);
  1. 在activity的onStop()方法裡面,取消所有的包含這個tag的請求任務。
@Override
protected void onStop () {
    super.onStop();
    if (mRequestQueue != null) {
        mRequestQueue.cancelAll(TAG);
    }
}

當取消請求時請注意:如果你依賴你的響應handler來標記狀態或者觸發另外一個程式,你需要對此進行考慮。再說一次,response handler是不會被執行的。

轉自:http://hukai.me/android-training-course-in-chinese/connectivity/volley/simple.html

相關文章