public class ResponseResult<T> {
private String code;
private T data;
private String msg;
private String requestId;
private String time;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getRequestId() {
return requestId;
}
public void setRequestId(String requestId) {
this.requestId = requestId;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
}
public <T> OnHttpResultListener jsonHttpWithData(Class<T> clazz, OnUiCallback<T> onUiCallback, OnNextListener<T> onNextListener) {
return new OnHttpResultListener() {
@Override
public void onSuccess(String s) {
if (!TextUtils.isEmpty(s)) {
GsonResponsePasare<T> pasare = new GsonResponsePasare<T>() {
};
ResponseResult<T> responseResult = pasare.deal(s);
LogUtils.i(TAG, "responseResult ==" + new Gson().toJson(responseResult));
jsonData(responseResult, onUiCallback, onNextListener);
} else {
if (onUiCallback != null) {
onUiCallback.onError(EXC_CODE, JSON_NULL);
}
}
}
@Override
public void onError(Throwable e) {
onUiCallback.onError(EXC_CODE, e.getMessage() == null ? "" : e.getMessage());
}
};
}
class GsonResponsePasare<T> implements ParameterizedType {
public ResponseResult<T> deal(String response) {
// Type gsonType = new ParameterizedType() {//...};//不建議該方式,推薦采用GsonResponsePasare實作ParameterizedType.因為getActualTypeArguments這里涉及獲取GsonResponsePasare的泛型集合
Type gsonType = this;
ResponseResult<T> result = new Gson().fromJson(response, gsonType);
// LogUtils.e("Data is : " + commonResponse.data, "Class Type is : " + commonResponse.data.getClass().toString());
return result;
}
@NotNull
@Override
public Type[] getActualTypeArguments() {
Class clz = this.getClass();
//這里必須注意在外面使用new GsonResponsePasare<GsonResponsePasare.DataInfo>(){};實體化時必須帶上{},否則獲取到的 superclass 為Object
Type superclass = clz.getGenericSuperclass(); //getGenericSuperclass()獲得帶有泛型的父類
if (superclass instanceof Class) {
throw new RuntimeException("Missing type parameter.");
}
ParameterizedType parameterized = (ParameterizedType) superclass;
Type[] types = parameterized.getActualTypeArguments();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
LogUtils.i(TAG, "getActualTypeArguments types =" + types[0].getTypeName());
}
return types;
}
@Override
public Type getOwnerType() {
return null;
}
@Override
public Type getRawType() {
return ResponseResult.class;
}
}
public OnHttpResultListener jsonLogin(OnUiCallback<Token> callback) {
return jsonHttpWithData(Token.class, callback, new OnNextListener<Token>() {
@Override
public void onNext(Token token) {
CacheDataModel.getInstance().saveLoginData(token);
}
});
}
方法呼叫是從jsonLogin 開始
例外:
Caused by: java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.xx.xx.entity.response.VehicleBindingList
請求結果共用了ResponseResult<T> result = new Gson().fromJson(response, gsonType);
問題原因:泛型沒有指定具體型別。
想問一下怎么解決,想共用fromJson這行代碼。
請求結果決議,共用了jsonHttpWithData方法。Class<T> clazz 現在沒有用上,之前有用到。
為什么不用
return new ParameterizedType() {
@Override
public Type[] getActualTypeArguments() {
return args;
}
@Override
public Type getRawType() {
return raw;
}
@Override
public Type getOwnerType() {
return null;
}
};沒有這樣直接指定的原因是:data 不只是 object ,還可能是 List<Object>
感謝

uj5u.com熱心網友回復:
哇,你這個描述看的我云里霧里的1.你的問題是要把網路請求的結果轉化成物體類嗎?
2.你想多個請求結果用同一個物體類轉化嗎?
uj5u.com熱心網友回復:
不好意思哈,描述的不好。是想共用一個方法做決議。
所有介面的回傳內容,都包含ResponseResult,里面的data各個介面不一樣,有的等于自定義object,有的等于陣列。
uj5u.com熱心網友回復:
我決議之前的資料都是string型別,是sdk統一提供出來的轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/247442.html
標籤:Android
