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);
}