一些關於volley分享擴展分享 volley基本用法、具體如何請求數據本文不做解釋,本次目的是一起嘗試如何擴展一下。
- 源碼簡單分析
- 實用擴展
二、實用擴展
以往根據官方的volly實現方案我們要從服務器請求一個json字符串,然後還要再從回調裏面解析json成對應的Object,重複勞動的同時,代碼整潔性也差。那麼能不能也一起封裝起來呢?答案是可以的。
- 我們首先從回調開始,想要達到的效果是直接返回我們想要的對象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中實現。