安卓中自定義並使用Volley框架請求網絡

  你們好,今天咱們講一下如何使用Volley框架請求網絡,爲什麼要使用Volley框架,這就要先說一下使用Volley框架請求網絡的優勢了,volley是易於定製的,即你能夠根據需求來設定volley框架,還有volley框架支持請求的優先級設定,即你能夠自主設定網絡請求的優先級,還有就是volley框架請求支持取消單個或多個請求,這個一會設置請求的時候會特別說明,還有它能夠自動調度網絡請求,至於其餘的如代碼的健壯性、支持多併發等等就不一一列舉了,說了那麼多下面就介紹如何自定義並使用Volley框架:android

  第一步:定義netrequest類繼承StringRequest類api

  一、在這個類裏首先要自定義三個全局變量,網絡

 

 1 private Priority priority;
 2 private Map<String,String> headers ;
 3 private Map<String,String> params;
 4 
 5 /**
 6      * 初始化全局變量
 7 */
 8 private void init(){
 9 priority = Priority.NORMAL;
10 headers = new HashMap<>();
11 params = new HashMap<>();
12     }

 

  二、實現兩個有參構造,在這兩個構造方法中並不須要再多些什麼,只要初始化自定義的三個全局變量。併發

1 public NetRequest(int method, String url, Response.Listener<String> listener, Response.ErrorListener errorListener) {
2 super(method, url, listener, errorListener);
3         init();
4     }
5 
6 public NetRequest(String url, Response.Listener<String> listener, Response.ErrorListener errorListener) {
7 super(url, listener, errorListener);
8         init();
9     }

  三、重寫設置優先級的方法框架

1 //設置優先級
2 @Override
3 public Priority getPriority() {
4 return priority;
5     }

  四、重寫爲請求添加請求頭信息的方法異步

 1 //爲請求添加頭信息的方法
 2 @Override
 3 public Map<String, String> getHeaders() throws AuthFailureError {
 4 return headers;
 5     }
 6 
 7 @Override
 8 public Map<String, String> getParams()throws AuthFailureError{
 9 return params;
10     }
11 
12 public NetRequest setPriority(Priority priority){
13 this.priority = priority;
14 return this;
15     }
16 
17 public NetRequest addRequestHeader(String key,String value){
18 this.headers.put(key,value);
19 return this;
20     }
21 
22 public NetRequest addParams(String key,String value){
23 this.params.put(key, value);
24 return this;
25     }

 

  五、自定義一個發送請求的方法,其中VolleyUtil類爲一個工具類,是本身定義的下一步就是定義它jsp

1 /**
2      * 發送請求
3 */
4 public void start(){
5             VolleyUtil.start(this);
6         }

  六、自定義一個靜態類Builder爲網絡請求傳參,這也被稱做構造者模式ide

 1 //構造者模式
 2 public static class Builder{
 3 
 4   private String url;
 5   private int method;
 6   private CallBack callBack;
 7 
 8   public Builder setCallBack(CallBack callBack){
 9     this.callBack  = callBack;
10     return this;
11       }
12   public Builder setUrl(String url){
13     this.url = url;
14     return this;
15       }
16   public Builder setMethod(int method){
17     this.method = method;
18     return this;
19       }
20  }

  七、自定義一個buileder方法請求網絡返回NetRequest(這一步比較關鍵)函數

 1       /**
 2          * 建立一個NetRequest請求網絡
 3          * @return  NetRequest
 4          */
 5     public NetRequest build(){
 6             NetRequest nr = new NetRequest(
 7                 method, 
 8                 url,
 9                 new Response.Listener<String>() {
10                     @Override
11                     public void onResponse(String response) {
12                         if (callBack!=null){
13                                 callBack.onSuccess(response);
14                             }
15                      }
16                 },
17                 new Response.ErrorListener() {
18                     @Override
19                     public void onErrorResponse(VolleyError error) {
20                         if (callBack!=null){
21                             callBack.onError(error);
22                             }
23                         }
24                  });
25         return nr;
26         }                    

  八、定義一個接口Callback包含兩個抽象方法來實現請求網絡四個參數的後兩個(由於網絡請求是一個異步的操做,因此請求的時候須要自定義一個類實現這個藉口並重寫接口中的這兩個方法)工具

1 import com.android.volley.VolleyError;
2 
3     /**
4      * Created by zhangdi on 2016/8/8.
5      */
6     public interface CallBack {
7         public void onSuccess(String respone);
8         public void onError(VolleyError error);
9     }    

  第二步:自定義一個工具類(就是第一步中start方法中的那個工具類,裏面的方法都設置成靜態的方便調用,這也是工廠模式的一種)

  一、首先要初始化請求隊列

 1 private static RequestQueue requestQueue;
 2     /**
 3      * 初始化請求隊列
 4      * @param mContext
 5      */
 6     public static void init(Context mContext){
 7         if (requestQueue==null){
 8             requestQueue = Volley.newRequestQueue(mContext);
 9         }
10     }

  二、設置get請求方法

 1    /**
 2      * get請求
 3      * @param url
 4      * @return
 5      */
 6     public static NetRequest.Builder get(String url){
 7         return new NetRequest.Builder()
 8                     .setMethod(Request.Method.GET)
 9                     .setUrl(url);
10     }

  三、設置post請求方法

1     /**
2      * post請求
3      * @return
4      */
5     public static NetRequest.Builder post(String url){
6         return new NetRequest.Builder()
7                 .setMethod(Request.Method.POST)
8                 .setUrl(url);
9     }

  四、定義開始運行start方法(即將請求添加到請求隊列)

1     /**
2      *將請求添加到請求隊列
3      */   
4     public  static void start(NetRequest nr){
5         requestQueue.add(nr);
6     }

  五、設置取消請求方法(利用方法重載來實現取消一個和取消一組)

1     //方法重載
2     public static void cancel(Object tag){
3         requestQueue.cancelAll(tag);
4     }
5 
6     public static void cancel(RequestQueue.RequestFilter filter){
7         requestQueue.cancelAll(filter);
8     }

這裏的cancel()方法第一個請求取消方法是把全部請求都取消,第二個請求取消方法是自定義選擇性的取消某個請求

  第三步:調用封裝好的靜態類實現請求網絡

  <1>先講一下使用get請求網絡

    一、定義一個內部類即網絡回調,實現Callback接口並重寫其中的兩個方法,須要如何重寫我已經在代碼塊中說明了,你們仔細閱讀

 1     private  class NetCallBack1 implements CallBack {
 2         @Override
 3         public void onSuccess(String respone) {
 4            這裏是請求成功是執行的操做
 5            記住網絡請求都是異步的,因此加載數據更新界面的功能都必須在這裏實現
 6            否則會報空指針的錯誤
 7         }
 8 
 9        @Override
10        public void onError(VolleyError error) {
11             這裏是執行網絡請求不成功後執行的操做
12        }
13 }    

    二、利用工廠模式進行請求網絡

1 VolleyUtil.get(你請求的網絡接口)
2                 .setCallBack(new NetCallBack())//這是上一步自定義的回調函數
3                 .build()
4                 .setPriority(Request.Priority.HIGH)
5                 .addRequestHeader("apikey","你本身的apiley")
6                 .start();

  <2>再講一下如何使用post請求

    我這裏就直接在在調用的時候就實現了callback接口,再也不單獨實現了

 1 VolleyUtil.post("http://192.168.191.1:8080/Server/doReg.jsp")
 2                  .setCallBack(new CallBack() {
 3                     @Override
 4                     public void onSuccess(String respone) {
 5                           請求成功是執行的步驟
 6                     }
 7 
 8                    @Override
 9                     public void onError(VolleyError error) {
10                           請求不成功時執行的步驟
11                     }
12                 })
13                 .build()
14                 .addParams("name","張三")
15                 .addParams("pwd","12345678")
16                 .setTag("post")
17                 .start();

其中addParams方法是在第二步NetRequest中有專門的定義,代碼能夠在第一步中尋找到

  至此使用volley框架請求網絡的步驟就算完成了,看起來定義比較麻煩,可是這是一勞永逸的,你在工程中只須要定義一遍,就能夠在工程中須要網絡請求的地方直接能夠調用,注意的是網絡請求還須要設置請求權限(若是你們不清楚如何設置能夠去我寫的關於定位的那篇文章中找到),這個須要在清單文件中申明,還有是若是你想一勞永逸還須要給工具類VolleyUtil進行初始化,這段代碼能夠放在全局類中即Application類中,代碼以下:

 1 /**
 2  * Created by zhangdi on 2016/8/23.
 3  */
 4 public class MyApplication extends Application {
 5 
 6     @Override
 7     public void onCreate() {
 8         super.onCreate();
 9         VolleyUtil.init(this);//初始化請求隊列
10     }
11 
12 }

  好了,到此自定義並使用Volley框架請求網絡數據的步驟就算所有結束了,固然網絡請求框架有不少種,Volley並非最好的,可是它的優勢也特別顯明,因此在對於輕量級的請求網絡數據時,使用Volley框架仍是利大於弊的,這裏筆者仍是比較建議使用的。仍是若是你們感受這篇文章還不錯的話就麻煩給推薦一下,如果有哪些地方總結的不對或是知識點有錯誤的地方仍是但願你們評論指正,謝謝。

相關文章
相關標籤/搜索