編輯:關於android開發
大家好,今天我們講一下如何使用Volley框架請求網絡,為何要使用Volley框架,這就要先說一下使用Volley框架請求網絡的優點了,volley是易於定制的,即你可以根據需求來設定volley框架,還有volley框架支持請求的優先級設定,即你可以自主設定網絡請求的優先級,還有就是volley框架請求支持取消單個或多個請求,這個一會設置請求的時候會特別說明,還有它可以自動調度網絡請求,至於其他的如代碼的健壯性、支持多並發等等就不一一列舉了,說了那麼多下面就介紹如何自定義並使用Volley框架:
第一步:定義netrequest類繼承StringRequest類
1、在這個類裡首先要自定義三個全局變量,
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 }
2、實現兩個有參構造,在這兩個構造方法中並不需要再多些什麼,只要初始化自定義的三個全局變量。
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 }
3、重寫設置優先級的方法
1 //設置優先級 2 @Override 3 public Priority getPriority() { 4 return priority; 5 }
4、重寫為請求添加請求頭信息的方法
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 }
5、自定義一個發送請求的方法,其中VolleyUtil類為一個工具類,是自己定義的下一步就是定義它
1 /** 2 * 發送請求 3 */ 4 public void start(){ 5 VolleyUtil.start(this); 6 }
6、自定義一個靜態類Builder為網絡請求傳參,這也被稱作構造者模式
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 }
7、自定義一個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 }
8、定義一個接口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、首先要初始化請求隊列
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 }
2、設置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 }
3、設置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 }
4、定義開始運行start方法(即將請求添加到請求隊列)
1 /** 2 *將請求添加到請求隊列 3 */ 4 public static void start(NetRequest nr){ 5 requestQueue.add(nr); 6 }
5、設置取消請求方法(利用方法重載來實現取消一個和取消一組)
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請求網絡
1、定義一個內部類即網絡回調,實現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 }
2、利用工廠模式進行請求網絡
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框架還是弊大於利的,這裡筆者還是比較建議使用的。還是如果大家感覺這篇文章還不錯的話就麻煩給推薦一下,若是有哪些地方總結的不對或是知識點有錯誤的地方還是希望大家評論指正,謝謝。
Android 手機衛士--綁定sim卡序列號,androidsim現在開始具體 處理每一個導航頁面的邏輯,首先看第二個導航頁 本文地址:http://www.cnbl
使用AIDL調用遠程服務設置系統時間,aidl調用系統 在實際工作中,經常遇到客戶需要用代碼設置系統時間的需求,但是Android非系統應用是無法設置系統時間
Android自定義View入門(一),androidview最近在寫一個關於音樂播放的應用,寫到播放界面UI時,就想自己實現的一個播放界面。那麼如何實現自定義View呢
Android Framework是怎麼啟動的? Framework運行環境是怎樣的? 安卓系統啟動過程其實是建立一套系統運行需要的環境。 Framework運行環境如下