能夠經過建立一個RequestQueue並傳遞Request對象來使用Volley。RequestQueue管理工做線程,這些線程用於運行網絡操做、讀取和寫入緩存和解析響應。Request對原始響應進行解析,而且Volley負責將已解析的響應分派回主線程。android
本文介紹如何使用Volley.newRequestQueue的便捷方法發送請求,該方法爲您這是了一個RequestQueue。本文還介紹瞭如何向RequestQueue添加請求和取消請求。緩存
使用Volley,須要將android.permission.INTERNET權限添加到app的清單文件中。不然app將不能鏈接網絡。網絡
Volley提供了一個便捷的方法Volley.newRequestQueue,它使用默認值建立一個RequestQueue,並啓動隊列。例如:app
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<String>() { @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控件,所以能夠直接從響應的處理程序中自由的修改UI控件。同時這對於本庫提供的許多主要特性也很重要,特別是與取消請求有關。ide
要發送一個請求,只須要構建一個請求,並使用RequestQueue的add()方法將其添加到RequestQueue中,如上所示。一旦添加了一個請求,它經過管道移動、獲得服務,並擁有本身的已投遞和解析的響應。this
當調用add()時,Vollley運行一個緩存處理線程和一個網絡調度線程池。當向隊列添加請求時,它由緩存線程拾取並分類:若是請求能夠被緩存處理,那麼緩存響應就在緩存線程中被解析而且解析後的響應被傳遞到主線程。若是請求不能被緩存處理,他被放置在網絡隊列中。第一個有效的網絡線程從隊列中獲取請求,執行HTTP事務,並在工做線程中解析響應,將響應寫入緩存,而後將解析過的響應送回主線程被傳遞。google
請注意,耗時操做(如阻塞I/O和解析/解碼)是在工做線程上完成的。能夠在任何線程中添加請求,可是響應始終在主線程上傳遞。 url
要取消一個請求,須要在Request對象上調用cancel()。一旦被取消,Volley保證響應處理程序永遠不會被調用。這在實踐中意味着能夠在activity的onStop()方法中取消全部待處理的請求而且沒必要在響應處理程序中檢查getActivity()==null。線程
要利用此行爲,您一般必須跟蹤全部正在運行的請求,以便可以在適當的時間取消它們。有一個更簡單的方法:能夠將標記對象與每一個請求相關聯。而後,可使用此標籤來提供要取消的請求範圍。例如,能夠標記Activity中的全部請求,並在onStop()中調用requestQueue.cancelAll(this)。一樣,可使用相應的標籤標記ViewPager一個標籤中的全部縮略圖請求,並在滑動時取消這些request以確保新標籤不被另外一個標籤的請求阻塞。code
下面是使用字符串標籤的例子:
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); } }
取消請求時請當心。若是您依賴於您的響應處理程序來推動狀態或啓動另外一個進程,則須要考慮這一點。