app端經常遇到這樣的需求:彈出一個Toast顯示服務端的提示資訊,比如:“使用者名已經被注冊”。
方法一:
public abstract class CommonCallback<T> extends Callback {
private Type type;
public CommonCallback() {
Class<? extends CommonCallback> clazz = getClass();
Type genericSuperclass = clazz.getGenericSuperclass();
if (genericSuperclass instanceof Class) {
throw new RuntimeException("沒有寫泛型");
}
ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass;
type = parameterizedType.getActualTypeArguments()[0];
}
@Override
public void onError(Call call, Exception e, int id) {
onError(e);
}
@Override
public void onResponse(String response, int id) {
try {
JSONObject resp = new JSONObject(response);
int resultCode = resp.getInt("resultCode");
if (resultCode == 1) {
String data = resp.getString("data");
onResponse((T) GsonUtil.getGson().fromJson(data, type));
} else {
onError(new Exception(resp.getString("resultMessage")));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
/**
* 傳回true使得所有請求,無論response code為多少都當做響應成功,交給onResponse方法處理,
* 便于不同錯誤響應的傳回
* @param response
* @param id
* @return
*/
@Override
public boolean validateReponse(Response response, int id) {
return true;
}
@Override
public String parseNetworkResponse(Response response, int id) throws IOException {
return response.body().string();
}
public abstract void onError(Exception e);
public abstract void onResponse(T response);
}
此方法通過将validateResponse方法傳回值設定為true,使得所有的response(無論response code為多少)都能通過檢測,被onResponse接收到,然後在外部邏輯傳入回調函數時實作onResponse和onError方法(最後兩個抽象方法),可以自由處理所有傳回資訊。此方法适用于項目自己定義了resultCode和resultMessage的情況,由服務端傳回這些資訊,然後用戶端在onResponse中直接顯示。
方法二:
public abstract class MyStringCallback extends Callback<string> {
@Override
public boolean validateReponse(Response response, int id) {
return true;
}
@Override
public String parseNetworkResponse(Response response, int id) throws Exception {
if(response.code()>=200 && response.code()<300){
return response.body().string();
}else{
throw new Exception("code is:"+response.code()+"\n"+response.body().string());
}
}
}
此方法仍然進行了響應的過濾(雖然validateResponse傳回true,但是在之後的parseNetworkResponse方法中進行了篩選)——response code在200到300之間的響應被onResponse接收,其餘響應被onError接收。唯一增添的靈活性就是可以自己添加Error的錯誤資訊(見代碼段else中)。