Volley實現自定義的網路請求Implementing a Custom Request

銳湃發表於2015-08-12

編寫: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提供了現成的JsonArrayRequestJsonArrayObject類。參考上一課建立標準的網路請求

轉自:http://hukai.me/android-training-course-in-chinese/connectivity/volley/request-custom.html

相關文章