開源項目鏈接
Volley主頁:https://android.googlesource.com/platform/frameworks/volley
Volley倉庫:git clone https://android.googlesource.com/platform/frameworks/volley
Volley GitHub Demo:在GitHub主頁搜索Volley會有很多,不過建議閱讀Android Developer文檔。
背景知識
Most requests have ready-to-use implementations in the toolbox; if your response is a string, image, or JSON, you probably won’t need to implement a custom Request.
For cases where you do need to implement a custom request, this is all you need to do:
- Extend the Request class, where represents the type of parsed response the request expects.
So if your parsed response is a string, for example, create your custom request by extending Request[String].
See the Volley toolbox classes StringRequest and ImageRequest for examples of extending Request[T]. - Implement the abstract methods parseNetworkResponse() and deliverResponse(), described in more detail below.
正如官方牛逼的說法一樣:
你要是請求的是string, image, or JSON還好辦,有現成的,前一篇已經詳細說明了。But你要是返回的不是這些呢?那就比較蛋疼,需要自定義。不過好的一點是Volley框架的擴展性非常好。所以如果需要customer的話你需要按照如下處理:
- 繼承Request[T]類,[T]就是你的響應數據格式。你可以在寫customer的時候參考StringRequest實現。
- 實現parseNetworkResponse() and deliverResponse()兩個抽象方法。
在StringRequest中,deliverResponse()方法調用了mListener中的onResponse()方法,並將response內容傳入。parseNetworkResponse()方法對服務器響應的數據進行解析,數據是字節的形式放在NetworkResponse的data變量中的,這裏將數據取出然後組裝成一個String,並傳入Response的success()方法中。
開搞一個實現
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));
}
}
}
這是官方的GSON的反饋解析實現。
public class XMLRequest extends Request<XmlPullParser> {
private final Listener<XmlPullParser> listener;
public XMLRequest(int method, String url, Listener<XmlPullParser> listener,
ErrorListener errorListener) {
super(method, url, errorListener);
this.listener = listener;
}
public XMLRequest(String url, Listener<XmlPullParser> listener, ErrorListener errorListener) {
this(Method.GET, url, listener, errorListener);
}
@Override
protected Response<XmlPullParser> parseNetworkResponse(NetworkResponse response) {
try {
String xmlString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlString));
return Response.success(xmlPullParser, HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (XmlPullParserException e) {
return Response.error(new ParseError(e));
}
}
@Override
protected void deliverResponse(XmlPullParser response) {
listener.onResponse(response);
}
}
這是一個XmlPullParser反饋解析的實現。
通過如上你會發現Volley框架不愧於是Google大牛搞的,連拓展自定義都這麼方便,設計模式運用的出神入化,膜拜。
文章轉自:http://blog.csdn.net/yanbober/article/details/45307099
感謝博主的無私分享!