Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android網絡通信必備神器Volley詳解——實現一個自定義的Request(以Gson為例)

Android網絡通信必備神器Volley詳解——實現一個自定義的Request(以Gson為例)

編輯:關於Android編程

雖然Volley已經提供了對於String,圖片,JSON,Request的解析,但是總會有些數據不屬於以上三種的,這時候就需要我們來自己實現的一個Request來解析我們需要的數據。

實現一個自定義的Request很簡單:

1. 繼承Request,T代表你要解析的類型,比如服務器返回的response是一個String,那麼就要繼承Request

2. 實現parseNetworkResponse()和deliverResponse()方法。

parseNetworkResponse

 

@Override
protected Response 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,這個參數中包含了HTTP的狀態碼,response的header等數據。我們重寫這個函數時,返回的Response必須包含你類型化的返回對象,緩存的metadata或者一個error。

Volley是在一個新線程裡調用parseNetworkResponse,防止主線程堵塞。

 

deliverResponse

Volley 在主線程中通過你在parseNetworkResponse()中返回的對象回調你。大多數的Request都會在這個方法觸發一個回調接口,例如
protected void deliverResponse(T response) {
        listener.onResponse(response);

 

例子:GsonRequest

public class GsonRequest extends Request {
    private final Gson gson = new Gson();
    private final Class clazz;
    private final Map headers;
    private final Listener 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 clazz, Map headers,
            Listener listener, ErrorListener errorListener) {
        super(Method.GET, url, errorListener);
        this.clazz = clazz;
        this.headers = headers;
        this.listener = listener;
    }

    @Override
    public Map getHeaders() throws AuthFailureError {
        return headers != null ? headers : super.getHeaders();
    }

    @Override
    protected void deliverResponse(T response) {
        listener.onResponse(response);
    }

    @Override
    protected Response 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));
        }
    }
}
 
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved