Android 關於volley的一些源碼和擴展 (二)

一些關於volley分享擴展分享 volley基本用法、具體如何請求數據本文不做解釋,本次目的是一起嘗試如何擴展一下。

二、實用擴展

以往根據官方的volly實現方案我們要從服務器請求一個json字符串,然後還要再從回調裏面解析json成對應的Object,重複勞動的同時,代碼整潔性也差。那麼能不能也一起封裝起來呢?答案是可以的。

  1. 我們首先從回調開始,想要達到的效果是直接返回我們想要的對象Object,但是又不確定Object類型,那麼就需要用到泛型,先定義一個接口。
public interface HttpResponseListener<T> {

    /**
     * 成功回調
     *
     * @param t
     */
    void onSuccess(T t);

    /**
     * 連接異常等等
     *
     * @param error
     */
    void onError(Exception error);

    /**
     * 請求完畢
     */
    void onFinish();

通過onSuccess返回自己想要的數據類型。

通過onError返回訪問期間發生的錯誤。

通過onFinish通知已經完成訪問,onSuccess和onError之後都會執行該方法。

2.我們開始定義我們自己的request,既然我上報給後臺的也是Json,那麼繼承JsonRequest會簡單的多。也可以繼承Requset,根據自己的需要決定。代碼如下:

public class ObjectFromJsonObjectRequst extends JsonRequest<String> {
    private HttpResponseListener listener;


    public ObjectFromJsonObjectRequst(int method,
                                      String url,
                                      JSONObject jsonRequest,
                                      HttpResponseListener listener) {
        super(method, url, jsonRequest.toString(), null, null);
        this.listener = listener;
    }


    @Override
    protected void deliverResponse(String response) {

        String data = response.toString();
        Log.d("HttpRespose", "HttpRespose--> " + data);

        Type[] genericInterfaces = listener.getClass().getGenericInterfaces();

        Type type = ((ParameterizedType) genericInterfaces[0]).getActualTypeArguments()[0];

        try {

            Object object = GsonHelper.fromJson(data, type);

            this.listener.onSuccess(object);

        } catch (Exception e) {
            Log.e("HttpRespose", "error: 數據解析異常,請檢查數據結構...");
            this.listener.onError(e);
        } finally {
            this.listener.onFinish();
        }
    }

    @Override
    public void deliverError(VolleyError error) {
        Log.e("HttpRespose", "error:" + error.getMessage());
        this.listener.onError(error);
        this.listener.onFinish();
    }


    @Override
    protected Response<String> parseNetworkResponse(NetworkResponse response) {
        String parsed;
        try {
            parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
        } catch (UnsupportedEncodingException e) {
            parsed = new String(response.data);
        }
        return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
    }
}

這裏指定了JsonRequst的類型爲String是因爲返回的byte數組轉爲String類型後再通過HttpResponseListener進行結果回調。
byte數組轉String不用多說。String轉Object可以用Google的Gson等。

首先重寫parseNetworkResponse方法把byte轉成String。

然後deliverResponse將String轉成對應的Object。具體怎麼轉,看deliverResponse中實現。

Demo源碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章