標籤:
接上文,這次來說一下如何使用Volley,會給出一些範例,和原理Volley使用 StringRequest
// 初始化一個請求隊列,RequestQueue是volley庫的類RequestQueue queue = Volley.newRequestQueue(this);String url ="http://www.baidu.com";//定義一個字串型請求隊列,需要傳遞4個參數分別是:url, 請求的方式(get, post..),響應成功的處理函數匿名對象, 相應出錯時候的處理函數匿名對象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!"); }});//添加到請求隊列中,預設就開始了網路請求queue.add(stringRequest);
按照Volley的設計規則,程式要只要建立一個RequestQueue,並傳遞一個Request對象行了。RequestQueue維護這一些正在訪問網路的線程的運行,讀寫緩衝,擷取網路請求的返回等事務。Request對象會再收到資料後進行解析,而RequestQueue還會負責將解析過的資料返回給主線程(UI線程),以便於你將資料在UI控制項中展示等。
要使用Volley,必須在應用的Menifest檔案中聲明android.permission.INTERNET的許可權。
Volley發送網路的過程解析
要想在代碼中擷取一個RequestQueue,預設可以使用Volley.newRequestQueue方法來完成,如上述代碼所示。當然你也可以自己定義一個你自己的RequestQueue。從上面的代碼看出,當Request對象建立好後,你只要調用RequestQueue的add()方法(參數就是Request對象)就能將這個網路請求發出。當add方法調用後,Volley會自動建立一個緩衝處理線程和一個網路請求線程池,Volley會先判斷你發送網路請求是否曾經存在於緩衝中,若已經存在,那麼緩衝處理線程會對發出請求進行處理並返回結果(中間沒有任何網路互動)。如果你發送的網路請求在緩衝沒有找到,那麼這個請求會被放在網路請求隊列中,網路請求線程池中會逐個從網路請求隊列中擷取請求內容,通過HTTP發生網路請求事務,返回的結果由Volley返回給主線程。
Volley取消網路請求操作
Volley庫可以在代碼中使用RequestQueue中的cancelAll()方法完成。比如,每個Request子類都有個setTag(Object obj)的方法,可以將每個tag設定為一類請求。比如你在一個Activity中的所有Request都用this(Activity的this就是該activity執行個體)作為setTag的參數,你可以隨時隨地調用RequestQueue的cancelAll(Object obj)方法,傳遞this作為obj的實參,這樣這個activity的所有網路請求都被取消了。當然也可以傳遞任意的字串類型的參數(最好有意義的字串),代碼執行個體:
public static final String TAG = "MyTag";StringRequest stringRequest; // Assume this exists.RequestQueue mRequestQueue; // Assume this exists.// 給Request設定tag進行分來stringRequest.setTag(TAG);mRequestQueue.add(stringRequest);
取消網路請求比較好的途徑是放在activity的onStop方法中(也可以是任何地方,這裡是慣例),如下
@Overrideprotected void onStop () { super.onStop(); if (mRequestQueue != null) { mRequestQueue.cancelAll(TAG); }}
另外需要注意的是,Request的響應處理函數(Response.Listener和Response.ErrorListener,見上)此時不會被調用。
如何在Request中設定Htpp請求的Header, Body?
要想設定request中的http請求中的header, boday內容可以重載getHeader方法
StringRequest request = new StringRequest(Request.Method.POST, "www.yoururl.com", new Response.Listener<String>() { @Override public void onResponse(String s) { }}, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { }}){ @Override public Map<String, String> getHeaders() throws AuthFailureError { HashMap<String, String> map = new HashMap<>(); Map<String, String> params = new HashMap<String, String>(); params.put("User-Agent", "Nintendo Gameboy"); params.put("Accept-Language", "fr"); params.put("Authorization", "Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b"); return params; }};
對你有用的話,就點個贊吧, :)
Android應用中網路請求庫Volley的使用