1.實際開發中,一般背景傳回的資料
// data 為 object 的情況
{"code":"0","message":"success","data":{}}
// data 為 array 的情況
{"code":"0","message":"success","data":[]}
2.對于上面的資料,進行JavaBean泛型的抽取
public ResBean<T>{
public String code;
public String message;
public T data;
}
3.先了解泛型解析的關鍵
public interface ParameterizedType extends Type {
// 傳回Map<String,User>裡的String和User,是以這裡傳回[String.class,User.class]
Type[] getActualTypeArguments();
// Map<String,User>裡的Map,是以傳回值是Map.class
Type getRawType();
// 用于這個泛型上中包含了内部類的情況,一般傳回null
Type getOwnerType();
}
4.資料請求後對JavaBean的解析,分兩種情況,Object和List類型。
public abstract class OKHttpCallback<T>{
public void onSucceed(String json) {
Type genType = this.getClass().getGenericSuperclass();
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
// 擷取T的類型
// 普通類型
Type actualType = params[0];
// List類型
if (!(actualType instanceof Class)){
Type typeOfT = ((ParameterizedType) actualType).getActualTypeArguments()[0];
Type listType = new ParameterizedTypeImpl(List.class, new Type[]{typeOfT});
// 根據List<T>生成完整的ResBean<List<T>>
actualType = new ParameterizedTypeImpl(ResBean.class, new Type[]{listType});
}
ResBean<T> bean = gson.fromJson(json, actualType);
// 對code判斷後傳回T
T data = bean.data;
// 一般用Handler切換到主線程(這裡隻是寫了關鍵代碼)
onSucceed(data);
}
public abstract void onSucceed(T data);
}