Google Volley使用之自定義

jopen 8年前發布 | 6K 次閱讀 Android開發 移動開發

【工匠若水 http://blog.csdn.net/yanbober】 閱讀前一篇《Google Volley使用之基礎》 http://blog.csdn.net/yanbober/article/details/45307015

開源項目鏈接

Volley自定義 Android Developer文檔

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】 繼續閱讀《 Google Volley框架源碼走讀》 http://blog.csdn.net/yanbober/article/details/45307217

來自: http://blog.csdn.net//yanbober/article/details/45307099

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!