上一章講到BaseViewModel中幾個狀態,而通常這幾個狀態都是根據網絡返回情況來判斷的,建立一個基類寫一個通用的網絡回調的話,就能把各種狀態設置好,不用在每個具體實現的類里重復去設置了。
Retrofit
網絡庫集成了Retrofit,我們通過繼承Retrofit的Callback來實現自己的HttpServiceCallBack抽象類,在HttpServiceCallBack 里面定義onHttpSuccess,onHttpFail,onNetWorkError,onHttpComplete,在具體實現中設置對應的狀態。
public abstract class HttpServiceCallBack<T> implements Callback<HttpResult<T>> {
@Override
public void onResponse(Call<HttpResult<T>> call, Response<HttpResult<T>> response) {
HttpResult<T> result = response.body();
if (result == null) {
//通常是服務器出錯返回了非約定格式
onHttpFail(response.code(),"網絡錯誤,請稍后再試");
} else {
if (result.getCode() == HttpStatusConstants.RESULT_OK) {
//正確返回約定的OK碼
onHttpSuccess(result.getContent(),result.getMsg());
}
else {
//返回約定的其他類型碼,可根據返回碼進行相對應的操作
onHttpFail(result.getCode(),result.getMsg());
}
}
onHttpComplete();
}
@Override
public void onFailure(Call<HttpResult<T>> call, Throwable t) {
//網絡異常或json解析失敗
onNetWorkError();
onHttpComplete();
}
public abstract void onHttpSuccess(T resultData,String msg);
public abstract void onHttpFail(int code, String msg);
public abstract void onNetWorkError();
public abstract void onHttpComplete();
}
上面HttpResult是接口對應統一返回格式
//content里面是json格式代表詳情
{"code":0,"msg":"獲取詳情成功","content":{"productId":"1200001","spotName":"門票名稱"}}
//或者content里面是jsonArray格式代表列表
{"code":0,"msg":"獲取詳情成功","content":[{"productId":"1200001","spotName":"門票名稱1"},{"productId":"1200002","spotName":"門票名稱2"}]}
具體請求數據請去看Retrofit的用法,相信大部分人都已經在用Retrofit了,在這里不做太多解釋。
通過上面自定義的HttpServiceCallBack,我們可以很輕松的去做斷點查看數據,因為我們之后所有的網絡請求返回結果都是通過HttpServiceCallBack。