原文鏈接:Implementing a Custom Request
這節(jié)課教你:
- 寫一個(gè)自定義的請求
這節(jié)課描述了如何實(shí)現(xiàn)自定義的請求類型远豺,這些請求類型不是Volley現(xiàn)成的(out-of-the-box)支持。
寫一個(gè)自定義的請求
多數(shù)請求在(Volley)工具箱中都有隨時(shí)可用的(ready-to-use)實(shí)現(xiàn);如果響應(yīng)是字符串朋魔、圖像或者JSON,那你大可不必實(shí)現(xiàn)自定義的Request
冷冗。
當(dāng)需要自己實(shí)現(xiàn)一個(gè)request時(shí)吱窝,下面的步驟是必須的:
繼承
Request<T>
類,<T>
表示request期望解析的response的類型拦英。所以蜒什,如果解析的response是字符串,打個(gè)比方疤估,創(chuàng)建自定義的request通過繼承Request<String>
灾常。以Volley的toolbox包中的StringRequest
和ImageRequest
為例,它們繼承自Request<T>
铃拇。實(shí)現(xiàn)抽象方法
parseNetworkResponse()
和deliverResponse()
钞瀑,下面會詳細(xì)描述
parseNetworkResponse
Response
類使用給定的類型(比如字符串、圖片或JSON)封裝了一個(gè)解析了的響應(yīng)慷荔,用于傳遞雕什。下面是parseNetworkResponse()
的實(shí)現(xiàn)例子:
@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
...
}
注意下面的幾條:
-
NetworkResponse
作為parseNetworkResponse()
的參數(shù),包含了byte[]類型的響應(yīng)負(fù)載(譯注:就是響應(yīng)體)显晶、HTTP狀態(tài)碼和響應(yīng)頭贷岸。 - 實(shí)現(xiàn)方法必須返回一個(gè)
Response<T>
,它包含了你指定的類型的響應(yīng)對象和緩存元數(shù)據(jù)或如解析出錯(cuò)時(shí)的錯(cuò)誤對象磷雇。
如果你的協(xié)議中沒有標(biāo)準(zhǔn)的緩存說明偿警,你可以自己構(gòu)建一個(gè)Cache.Entry
,但是大多數(shù)的請求只要如下這樣就夠了(唯笙?):
return Response.success(myDecodedObject,
HttpHeaderParser.parseCacheHeaders(response));
Volley從工作線程調(diào)用parseNetworkResponse()
螟蒸。這樣保證了昂貴的解析操作落剪,比如解碼一個(gè)JPEG圖片成Bitmap,不會中斷UI線程尿庐。
deliverResponse
Volley將parseNetworkResponse()
中返回的對象傳遞到主線程忠怖。多數(shù)請求會在此調(diào)用一個(gè)回調(diào)接口,比如:
protected void deliverResponse(T response) {
listener.onResponse(response);
例子:GsonRequest
Gson是一個(gè)庫抄瑟,它通過反射技術(shù)實(shí)現(xiàn)Java對象和JSON之間的轉(zhuǎn)化凡泣。你可以使用跟JSON的key相對應(yīng)的名字創(chuàng)建java對象,然后傳遞給Gson對象皮假,接著Gson就會幫你填充字段值鞋拟。下面是一個(gè)關(guān)于Volley請求和使用Gson解析的完整例子:
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
類惹资。查閱Using Standard Request Types獲取更多信息贺纲。
項(xiàng)目源碼下載 :點(diǎn)擊下載
系列索引
- 【譯】Volley官方文檔五:實(shí)現(xiàn)一個(gè)自定義的Request
- 【譯】Volley官方文檔四:構(gòu)建一個(gè)標(biāo)準(zhǔn)的Request
- 【譯】Volley官方文檔三:建立一個(gè)RequestQueue
- 【譯】Volley官方文檔二:發(fā)送一個(gè)簡單的request
- 【譯】Volley官方文檔一:使用Volley傳遞網(wǎng)絡(luò)數(shù)據(jù)
更新日志:
- 2016年03月21日
- 添加系列索引