標籤:
最近閑來想看看android網路方面的東西。google在2013年發布了一個叫做Volley的網路請求架構,我看了一下官網,居然在training裡面就有教程。首先,英文的東西看著
還是挺不爽的,特此翻譯一下,正好自己也學習一下, 可能最後有時間也會去研究一下它的源碼是怎麼寫的。下面開始:
第一回:發送一個簡單的請求
當你用Volley的時候,你的流程分為幾步:
1、你會建立一個RequestQueue並且傳給它一個Request對象。
2、之後這個RequestQueue就會組織一些背景工作執行緒(奴隸?)來運行這個網路請求操作。
3、請求完成之後寫入cache並解析這個返回的結果。Request的工作是解析這個原始的返回,Volley關心的是怎麼把這些返回的資料傳送到你的主線程。
這一回課將會叫你怎樣通過通過Volley.newRequestQueue這個方便的方法來發送一個請求,這個方法會為你自動建立一個RequestQueue。如果想要知道怎麼自訂一個RequestQueue
請看Volley使用指南第二回。下面我們來看看怎樣在RequestQueue裡面添加一個request和怎樣取消一個request
第一步。首先,你要把android網路許可權開啟,把android.permission.INTERNET添加到你的mainifest檔案裡面。
第二步。
使用newRequestQueue:
Volley提供了一個方便的方法叫做Volley.newRequestQueue,它可以為你自動建立一個RequestQueue,那麼它使用的是預設參數啟動這個queue,舉個栗子:
1 final TextView mTextView = (TextView) findViewById(R.id.text); 2 ... 3 4 // Instantiate the RequestQueue. 5 RequestQueue queue = Volley.newRequestQueue(this); 6 String url ="http://www.baidu.com"; 7 8 // Request a string response from the provided URL. 9 StringRequest stringRequest = new StringRequest(Request.Method.GET, url,10 new Response.Listener<String>() {11 @Override12 public void onResponse(String response) {13 // Display the first 500 characters of the response string.14 mTextView.setText("Response is: "+ response.substring(0,500));15 }16 }, new Response.ErrorListener() {17 @Override18 public void onErrorResponse(VolleyError error) {19 mTextView.setText("That didn‘t work!");20 }21 });22 // Add the request to the RequestQueue.23 queue.add(stringRequest);
那麼google被牆,測試網站就用百度。Volley做的工作是把解析好的response發給主線程。在主線程裡面使用接收到的資料填充UI是很容易的,因為你可以很輕鬆地使用handler
改變你的UI,但這對於這個架構的其他文法來說是相當危險的, 比如說取消操作。
第三步。發送一個請求。
要發送請求,你首先要構造一個用add()方法把它添加到RequestQueue裡面。當你把它add進去了以後,它就會通過一個類似於管道的東西,之後得到執行,把擷取到的東西
解析出來然後傳遞到主線程。當你調用call()方法的時候,Volley會啟動一個緩衝線程和一些網路分發線程。當你添加一個request,它會被cache線程識別和篩選,過程是:
如果你的request能夠被cache所服務(已經緩衝),那麼它就會被cache線程解析並發送到主線程。如果沒有被緩衝,執行以下幾步:
1、就把它加入網路請求的隊列。
2、第一個可用的網路線程從RequestQueue中接到這個工作,執行http請求。
3、在worker thread裡面解析這個請求
4、把解析好的資料寫入cache。
5、最後把資料發送到主線程。
下面是這一過程的生命週期圖:
第四步。取消一個請求
要取消一個請求,在你的Request對象上調用cancal()方法。一旦取消請求,Volley就一定不會執行response handler。你可以在onStop()方法裡面把即將發出的請求取消掉,
這樣你就不用處理一團亂的response handlers問題,無論對於onSaveInstanceState()已經被調用還是其他問題。
如果你想利用好這個特性,你要給每個執行中的request打上一個標記以便在必要的時候取消它們。有一個簡單的方法可以做到這一點:你可以為你的request對象和一個tag對象
做一個聯絡,然後你可以利用這些標記取消請求。舉個栗子:你可以為你的Activity所有的request都打上標籤,然後在onStop()方法調用requestQueue.cancelAll(this)。
同樣的,你可以為viewPager裡面的圖片請求打上標籤並在適當的時間取消請求,以便在滑動標籤的時候,下一個標籤頁不會因為上一個標籤頁的圖片請求未完成而掛起。
下面是一個使用string tag的栗子:
1 public static final String TAG = "MyTag";2 StringRequest stringRequest; // Assume this exists.3 RequestQueue mRequestQueue; // Assume this exists.4 5 // Set the tag on the request.6 stringRequest.setTag(TAG);7 8 // Add the request to the RequestQueue.9 mRequestQueue.add(stringRequest);
1 @Override2 protected void onStop () {3 super.onStop();4 if (mRequestQueue != null) {5 mRequestQueue.cancelAll(TAG);6 }7 }
當你在取消請求的時候要當心。如果你使用response handler去推進一個狀態或者是啟動另外一個進程,你要為此負責。再說一遍,一旦取消,response handler就不會執行。
Volley使用指南第一回(來自developer.android)