Android Volley架構的使用(二),androidvolley

來源:互聯網
上載者:User

Android Volley架構的使用(二),androidvolley

在上一篇文章中介紹了volley架構的特性,如何將volley.jar引入我們的項目,以及volley架構中最常用的兩個類 RequestQueue Request基本的使用方法;這篇介紹Volley使用中更常用到的一些知識點;
建議先看上篇文章:Android Volley的使用(一)

文章結構如下:

使用請求隊列RequestQueue

Volley中的Request都需要添加到RequestQueue中才能執行,所以首先需要建立一個RequestQueue

RequestQueue reqQueue=Volley.newRequestQueue(this);//this指的是Context對象

通常情況在一個應用中需要統一管理一個請求隊列,所以採用單例模式(注意:這不是必須的,但是採用這種方式有很多好處~),即在整個應用中持有一個Application對象,通過建立一個繼承自Application的類,並在這個類中初始化RequestQueue等核心對象,以及實現一些我們所需的方法;

public class ApplicationController extends Application{//建立一個TAG,方便調試或Log    private static final String  TAG=getApplication().getSimpleName();//建立一個全域的請求隊列    private RequestQueue reqQueue;//建立一個static ApplicationController對象,便於全域訪問    private static ApplicationController mInstance;    @Override    public void onCreate(){        super.onCreate();        //初始化        mInstance=this;    }    /**    *以下為需要我們自己封裝的添加請求取消請求等方法    */    //用於返回一個ApplicationController單例    private static synchroized ApplicationController getInstance(){        return mInstance;    }    //用於返回全域RequestQueue對象,如果為空白則建立它    public RequestQueue getRequestQueue(){        if(reqQueue==null)                         reqQueue=Volley.newRequestQueue(getApplicationContext);        return reqQueue;    }/***將Request對象添加進RequestQueue,由於Request有*StringRequest,JsonObjectResquest...等多種類型,所以需要用到*泛型。同時可將*tag作為選擇性參數以便標示出每一個不同請求*/    public <T> void addToRequestQueue(Request<T> req,String tag){    //如果tag為空白的話,就是用預設TAG        req.setTag(TextUtils.isEmpty(tag)?TAG:tag);         getRequestQueue().add(req);    }    public <T> void addToRequestQueue(Request<T> req){        req.setTag(TAG);        getRequestQueue().add(req);    }//通過各Request對象的Tag屬性取消請求    public void cancelPendingRequests(Object tag){        if(reqQueue!=null){            reqQueue.cancelAll(tag);        }    }}

Tips:實現自己的Application類後,我們需要在Manifest.xml中改寫

<application android:name=".ApplicationController"        ....>
執行非同步請求

上篇文章已經提到過,Volley主要提供了以下幾種類型的非同步請求:

  • JsonObjectRequest 用來接收和發送JsonObject類型的資料
  • JsonArrayRequest 用來接收和發送JsonArray類型的資料
  • StringRequest 用來接收和發送響應主體為String的資料
JsonObjectRequest

這是一個用來發送和接收JSON資料最常用的類,覆寫這個類中的一些方法可以發送(GET,POST,DELETE,PUT)等適當的HTTP請求,常見作業碼樣本:

final String url="http://www.jycoder.com/person.json";JsonObjectRequest req=new JsonObjectRequest(url,null,                            new Response.Listener<JsonObject>(){    @Override    public void onResponse(JsonObject response){    //正確響應時回調此函數    }},new ResponseError.Listener(){    @Override    public void onErrorResponse(VolleyError error){            //未正確響應時回調此函數    }});//將請求添加至全域RequestQueueApplicationController.getInstance().addToRequestQueue(req);
發送包含HTTP 要求方法(Post Put Get Delete)的 Request

如果我們想要發送Post,Delete等請求,可通過一個帶請求參數的JsonObject對象來實現

//用來儲存post參數HashMap<String,String> params=new HashMap<String,String>();params.put("userId","123189283");//new JsonObject(params) 作為 JsonObjectRequest 參數JsonObjectRequest req=new JsonObjectRequest(url,                        new JsonObject(params),                    new Response.Listener<JsonObject>(){...},                    new Response.ErrorListener(){...});
發送JsonArrayRequest StringRequestJsonObjectRequest類似
JsonArrayRequest req=new JsonArrayRequest(url,        new Response.Listener<JsonArray>(){..},        new Response.ErrorListener(){..});StringRequest req=new StringRequest(url,        new Response.Listener<String>(){..},        new Response.ErrorListener(){..});
取消Request

Volley架構提供了強大的API來支援取消正在等待或者啟動並執行一個或多個請求,還記得我們先前提到的setTag()方法嗎,正是通過Tag來標示每個Request,我們特可以通過這個Tag來取消Request

//可以通過setTag方法為每一個Request添加tagreq.setTag("My Tag");//也可以在我們實現的添加進RequestQueue的時候設定ApplicationController.getInstance().addToRequestQueue(req,"My Tag");//取消RequestreqQueue.cancelAll("My Tag");//或者我們前面實現的方法ApplicationController.getInstance().cancelPendingRequests("My Tag");

Tips:學習完上面三個方面的知識,我們就已經差不多掌握了Volley最常用的方法,如果想讓你的應用更健壯,還需要瞭解Volley中的錯誤處理,佈建要求失敗重試機制和逾時機制,佈建要求優先順序,佈建要求頭部等等

拓展部分 請求失敗時的重試和請求自訂逾時

Volley中提供了一個方案:可以通過Request對象調用setRetryPolicy()方法,設定逾時和重試請求

request.setRetryPolicy(new DefaultRetryPolicy(20*1000,1,1.0f));/**DefaultRetryPolicy(int,int,float);中第一個代表逾時時間:即超過20S認為逾時,第三個參數代表最大重試次數,這裡設定為1.0f代表如果逾時,則不重試*/
佈建要求優先順序

在實際開發中我們常常需要提高一些請求的優先順序以便優先執行,可以通過覆寫getPrioriity()方法,

//優先順序有LOW,NORMAL,HIGH,IMMEDIATEprivate Priority priority = Priority.HIGH;StringRequest strReq = new StringRequest(Method.GET,          Const.URL_STRING_REQ,           new Response.Listener<String>() {     @Override     public void onResponse(String response) {             Log.d(TAG, response.toString());             msgResponse.setText(response.toString());             hideProgressDialog();         }     }, new Response.ErrorListener() {      @Override      public void onErrorResponse(VolleyError error) {              VolleyLog.d(TAG, "Error: " + error.getMessage());              hideProgressDialog();      }  }) {     @Override      public Priority getPriority() {           return priority;      }};
佈建要求頭部(HTTP 頭部)

很多時候需要給HTTP Request添加頭部,一個典型的情境就是基本的HTTP 授權認證,Request類中提供了getHeaders()方法,你需要覆寫並添加自己的自訂頭部

@Overridepublic Map<String, String> getHeaders() throws AuthFailureError {    HashMap<String, String> headers = new HashMap<String, String>();    headers.put("CUSTOM_HEADER", "Yahoo");    headers.put("ANOTHER_CUSTOM_HEADER", "Google");    return headers;}
錯誤處理

你可能已經注意到了在建立Request對象時,構造參數中有new Response.ErrorListener(),這就是典型的錯誤處理

volley中錯誤主要有以下幾類:

  • AuthFailureError — 基本的Http身份認證(授權)錯誤.
  • NetworkError — 網路錯誤
  • NoConnectionError — 網路連接錯誤.
  • ParseError — 資料解析錯誤.
  • ServerError — 服務端錯誤.
  • TimeoutError — 逾時錯誤.

你可以實現自己的錯誤處理類,用來返回具體的錯誤資訊

 public class VolleyErrorHelper {     //用於返回具體錯誤資訊,分辨錯誤類別      public static String getMessage(Object error, Context context) {        if (error instanceof TimeoutError) {            return context.getResources().getString(R.string.generic_server_down);            }else if (isServerProblem(error)) {                return handleServerError(error, context);            }else if (isNetworkProblem(error)) {                return context.getResources().getString(R.string.no_internet);            }            return context.getResources().getString(R.string.generic_error);        }        //判斷是否是網路錯誤        private static boolean isNetworkProblem(Object error) {            return (error instanceof NetworkError) ||                 (error instanceof NoConnectionError);        }        //判斷是否是服務端錯誤        private static boolean isServerProblem(Object error) {            return (error instanceof ServerError) ||                 (error instanceof AuthFailureError);        }        //處理服務端錯誤        private static String handleServerError(Object err, Context context) {            VolleyError error = (VolleyError) err;            NetworkResponse response = error.networkResponse;            if (response != null) {                switch (response.statusCode) {                    case 404:                    case 422:                    case 401:                        try {                        // server might return error like this { "error": "Some error occured" }                        // Use "Gson" to parse the result                        HashMap<String, String> result = new Gson().fromJson(new String(response.data),                        new TypeToken<Map<String, String>>() {}.getType());            if (result != null && result.containsKey("error")) {                return result.get("error");            }            } catch (Exception e) {                e.printStackTrace();            }            return error.getMessage();            default:                return context.getResources().getString(R.string.generic_server_down);            }        }        return context.getResources().getString(R.string.generic_error);      }    }
總結:

綜上,我們已經基本上學完了Volley架構的大部分知識,唯一還沒有涉及到且比較重要的就是映像緩衝方面的內容,將在下篇部落格中介紹;記得關注個人微博,公眾平台哦,

參考資料:Asynchronous HTTP Requests in Android Using Volley

  • 微博: @明桑Android黑曆史
  • 郵箱: <13141459344@163.com>
  • 個人首頁: 明桑戰勝Android汪的黑曆史

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.