Volley實現自定義的網路請求Implementing a Custom Request
編寫:kesenhoo - 原文:http://developer.android.com/training/volley/request-custom.html
這節課會介紹如何實現你自定義的請求型別,這些自定義的型別不屬於Volley內建支援包裡面。
Write a Custom Request
大多數的請求型別都已經包含在Volley的工具箱裡面。如果你的請求返回數值是一個string,image或者JSON,那麼你是不需要自己去實現請求類的。
對於那些你需要自定義的請求型別,你需要執行以下操作:
- 繼承
Request<T>
類,<T>
表示請求返回的資料型別。因此如果你需要解析的響應型別是一個String,可以通過繼承Request<String>
來建立你自定義的請求。請參考Volley工具類中的StringRequest與 ImageRequest來學習如何繼承Request。 - 實現抽象方法
parseNetworkResponse()
與deliverResponse()
,下面會詳細介紹。
parseNetworkResponse
為了能夠提交一種指定型別的資料(例如,string,image,JSON等),需要對解析後的結果進行封裝。下面會演示如何實現parseNetworkResponse()
。
@Override
protected Response<T> parseNetworkResponse(
NetworkResponse response) {
try {
String json = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
return Response.success(gson.fromJson(json, clazz),
HttpHeaderParser.parseCacheHeaders(response));
}
// handle errors
...
}
請注意:
parseNetworkResponse()
的引數是型別是NetworkResponse
,這種引數包含了的響應資料內容有一個byte[],HTTP status code以及response headers.- 你實現的方法必須返回一個Response,它包含了你響應物件與快取metadata或者是一個錯誤。
如果你的協議沒有標準的cache機制,你可以自己建立一個Cache.Entry
, 但是大多數請求都可以用下面的方式來處理:
return Response.success(myDecodedObject,
HttpHeaderParser.parseCacheHeaders(response));
Volley在工作執行緒中執行parseNetworkResponse()方法。這確保了耗時的解析操作,例如decode一張JPEG圖片成bitmap,不會阻塞UI執行緒。
deliverResponse
Volley會把parseNetworkResponse()方法返回的資料帶到主執行緒的回撥中。如下所示:
protected void deliverResponse(T response) {
listener.onResponse(response);
Example: GsonRequest
Gson是一個使用對映支援JSON與Java物件之間相互轉換的庫檔案。你可以定義和JSON keys相對應名稱的Java物件。把物件傳遞給傳遞Gson,然後Gson會幫你為物件填充欄位值。 下面是一個完整的示例:演示了使用Gson解析Volley資料:
public class GsonRequest<T> extends Request<T> {
private final Gson gson = new Gson();
private final Class<T> clazz;
private final Map<String, String> headers;
private final Listener<T> listener;
/**
* Make a GET request and return a parsed object from JSON.
*
* @param url URL of the request to make
* @param clazz Relevant class object, for Gson's reflection
* @param headers Map of request headers
*/
public GsonRequest(String url, Class<T> clazz, Map<String, String> headers,
Listener<T> listener, ErrorListener errorListener) {
super(Method.GET, url, errorListener);
this.clazz = clazz;
this.headers = headers;
this.listener = listener;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
return headers != null ? headers : super.getHeaders();
}
@Override
protected void deliverResponse(T response) {
listener.onResponse(response);
}
@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
try {
String json = new String(
response.data,
HttpHeaderParser.parseCharset(response.headers));
return Response.success(
gson.fromJson(json, clazz),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JsonSyntaxException e) {
return Response.error(new ParseError(e));
}
}
}
如果你願意使用的話,Volley提供了現成的JsonArrayRequest
與JsonArrayObject
類。參考上一課建立標準的網路請求
轉自:http://hukai.me/android-training-course-in-chinese/connectivity/volley/request-custom.html
相關文章
- volley建立標準的網路請求(Making a Standard Request)
- Volley傳送簡單的網路請求(Sending a Simple Request)
- Android網路請求(4) 網路請求框架VolleyAndroid框架
- Volley 原始碼解析之網路請求原始碼
- 給請求追加自定義值 $request->offsetSet ($key,$value)
- Android Volley 非同步網路請求分析Android非同步
- Volley 網路請求框架介紹與使用說明框架
- ASP.NET Core - 實現Http自定義請求頭策略ASP.NETHTTP
- Angular HTTP 請求自定義 timeout 值的一種實現思路AngularHTTP
- Android Volley 原始碼解析(一),網路請求的執行流程Android原始碼
- flutter dio網路請求封裝實現Flutter封裝
- 使用Retrofit+RxJava實現網路請求RxJava
- RxJava+Retrofit+Gson實現網路請求RxJava
- postman發請求前實現的操作Pre-request ScriptPostman
- Flutter 網路請求的三種簡單實現Flutter
- 網路請求-手把手實現axiosiOS
- ajax中設定請求頭和自定義請求頭
- .net core基於HttpClient實現的網路請求庫HTTPclient
- 自定義處理頁面請求
- 分分鐘使用Retrofit+Rxjava實現網路請求RxJava
- Laravel 是如何請求 Request 的Laravel
- Android網路請求(終) 網路請求框架RetrofitAndroid框架
- Android網路請求(3) 網路請求框架OkHttpAndroid框架HTTP
- 封裝 Laravel 自定義表單請求封裝Laravel
- 簡單介紹shell中的curl網路請求的實現
- 自定義的請求頭,你去哪裡了?
- flutter 自定義驗證碼輸入框實現 verification_code_customFlutter
- Android 網路框架之OKhttp實現https請求Android框架HTTP
- Sanic request 請求資料
- 跟我一起動手實現Tomcat(三):解析Request請求引數、請求頭、cookieTomcatCookie
- Kotlin + 協程 + Retrofit + MVVM優雅的實現網路請求KotlinMVVM
- 網路請求了
- 網路請求優化之取消請求優化
- okhttp 原始碼解析 - 網路協議的實現 - 請求流程: 請求的傳送與響應的接收HTTP原始碼協議
- urllib.request.Request物件封裝請求物件封裝
- 微信小程式如何呼叫API實現資料請求-wx.request()微信小程式API
- 利用hutool發起自定義編碼格式的請求
- 使用Spring Request-Reply實現基於Kafka的同步請求響應SpringKafka