Android Volley框架的使用(二)
??此博文源碼下載地址 ?https://github.com/Javen205/VolleyDemo.git
使用請求隊列RequestQueue
Volley中的Request都需要添加到RequestQueue中才能執(zhí)行,所以首先需要創(chuàng)建一個RequestQueue
RequestQueue = Volley.newRequestQueue(mContext);通常情況在一個應(yīng)用中需要統(tǒng)一管理一個請求隊列,所以采用單例模式(注意:這不是必須的),創(chuàng)建一個類并在這個類中初始化RequestQueue等核心對象,以及實現(xiàn)一些我們所需的方法;
代碼如下:
?
執(zhí)行異步請求
上篇文章已經(jīng)提到過,Volley主要提供了以下幾種類型的異步請求:
- JsonObjectRequest 用來接收和發(fā)送JsonObject類型的數(shù)據(jù)
- JsonArrayRequest 用來接收和發(fā)送JsonArray類型的數(shù)據(jù)
- StringRequest 用來接收和發(fā)送響應(yīng)主體為String的數(shù)據(jù)
JsonObjectRequest
這是一個用來發(fā)送和接收J(rèn)SON數(shù)據(jù)最常用的類,覆寫這個類中的一些方法可以發(fā)送(GET,POST,DELETE,PUT)等適當(dāng)?shù)腍TTP請求,常見操作代碼示例:
?
final String url="http://xxx";JsonObjectRequest req=new JsonObjectRequest(url,null,new Response.Listener<JsonObject>(){@Overridepublic void onResponse(JsonObject response){//正確響應(yīng)時回調(diào)此函數(shù) }},new ResponseError.Listener(){@Overridepublic void onErrorResponse(VolleyError error){//未正確響應(yīng)時回調(diào)此函數(shù) } }); //將請求添加至全局RequestQueue VolleyController.getInstance(context).addToRequestQueue(req);?
發(fā)送包含HTTP 請求方法(Post?Put?Get?Delete)的 Request:
如果我們想要發(fā)送Post,Delete等請求,可通過一個帶請求參數(shù)的JsonObject對象來實現(xiàn)
?
//用來保存post參數(shù) HashMap<String,String> params=new HashMap<String,String>(); params.put("user","xxx");//new JsonObject(params) 作為 JsonObjectRequest 參數(shù) JsonObjectRequest req=new JsonObjectRequest(url,new JsonObject(params),new Response.Listener<JsonObject>(){...},new Response.ErrorListener(){...});?
發(fā)送JsonArrayRequest?StringRequest與JsonObjectRequest類似:
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框架提供了強(qiáng)大的API來支持取消正在等待或者運行的一個或多個請求,還記得我們先前提到的setTag()方法嗎,正是通過Tag來標(biāo)示每個Request,我們特可以通過這個Tag來取消Request
//可以通過setTag方法為每一個Request添加tag req.setTag("Tag"); //也可以在我們實現(xiàn)的添加進(jìn)RequestQueue的時候設(shè)置 VolleyController.getInstance(context).cancelPendingRequests("Tag");//取消Request reqQueue.cancelAll("Tag"); //我們前面實現(xiàn)的方法 VolleyController.getInstance(context).cancelPendingRequests("Tag");》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
學(xué)習(xí)完上面三個方面的知識,我們就已經(jīng)差不多掌握了Volley最常用的方法,如果想讓你的應(yīng)用更健壯,還需要了解Volley中的錯誤處理,設(shè)置請求失敗重試機(jī)制和超時機(jī)制,設(shè)置請求優(yōu)先級,設(shè)置請求頭部等等
?
?
拓展部分
請求失敗時的重試和請求自定義超時
?
Volley中提供了一個方案:可以通過Request對象調(diào)用setRetryPolicy()方法,設(shè)置超時和重試請求
?
?
// 第一個代表超時時間:即超過20S認(rèn)為超時,第三個參數(shù)代表最大重試次數(shù),這里設(shè)置為1.0f代表如果超時,則不重試req.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, 1, 1.0f));設(shè)置請求優(yōu)先級
在實際開發(fā)中我們常常需要提高一些請求的優(yōu)先級以便優(yōu)先執(zhí)行,可以通過覆寫getPrioriity()方法
//優(yōu)先級有LOW,NORMAL,HIGH,IMMEDIATE private Priority priority = Priority.HIGH;StringRequest strReq = new StringRequest(Method.GET,Const.URL_STRING_REQ, new Response.Listener<String>() {@Overridepublic void onResponse(String response) {Log.d(TAG, response.toString());msgResponse.setText(response.toString());hideProgressDialog();}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {VolleyLog.d(TAG, "Error: " + error.getMessage());hideProgressDialog();}}) {@Overridepublic Priority getPriority() {return priority;} };?
設(shè)置請求頭部(HTTP 頭部)
很多時候需要給HTTP Request添加頭部,一個典型的場景就是基本的HTTP 授權(quán)認(rèn)證,Request類中提供了getHeaders()方法,你需要覆寫并添加自己的自定義頭部
@Override public 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; }錯誤處理
你可能已經(jīng)注意到了在創(chuàng)建Request對象時,構(gòu)造參數(shù)中有new Response.ErrorListener(),這就是典型的錯誤處理
volley中錯誤主要有以下幾類:
- AuthFailureError — 基本的Http身份認(rèn)證(授權(quán))錯誤.
- NetworkError — 網(wǎng)絡(luò)錯誤
- NoConnectionError — 網(wǎng)絡(luò)連接錯誤.
- ParseError — 數(shù)據(jù)解析錯誤.
- ServerError — 服務(wù)端錯誤.
- TimeoutError — 超時錯誤.
你可以實現(xiàn)自己的錯誤處理類,用來返回具體的錯誤信息
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);}//判斷是否是網(wǎng)絡(luò)錯誤private static boolean isNetworkProblem(Object error) {return (error instanceof NetworkError) || (error instanceof NoConnectionError);}//判斷是否是服務(wù)端錯誤private static boolean isServerProblem(Object error) {return (error instanceof ServerError) || (error instanceof AuthFailureError);}//處理服務(wù)端錯誤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 resultHashMap<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);}}總結(jié):
? ? 綜上,我們已經(jīng)基本上學(xué)完了Volley框架的大部分知識,唯一還沒有涉及到且比較重要的就是圖像緩存方面的內(nèi)容,將在下篇博客中介紹
參考資料:Asynchronous HTTP Requests in Android Using Volley? blog
總結(jié)
以上是生活随笔為你收集整理的Android Volley框架的使用(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 自动补全
- 下一篇: 关于 Android 和 iOS 流畅度