在使用okGo库时,需要自己编写一个JsonCallBack,这个简单记录一下。
public abstract class JsonCallback<T> extends AbsCallback<T> {
private Type type;
private Class<T> clazz;
public JsonCallback() {
}
public JsonCallback(Type type) {
this.type = type;
}
public JsonCallback(Class<T> clazz) {
this.clazz = clazz;
}
@Override
public void onStart(Request<T, ? extends Request> request) {
super.onStart(request);
// 主要用于在所有请求之前添加公共的请求头或请求参数
// 例如登录授权的 token
// 使用的设备信息
// 可以随意添加,也可以什么都不传
// 还可以在这里对所有的参数进行加密,均在这里实现
//request.headers("header1", "HeaderValue1")//
//.params("params1", "ParamsValue1")//
//.params("token", "3215sdf13ad1f65asd4f3ads1f");
}
/**
* 该方法是子线程处理,不能做ui相关的工作
* 主要作用是解析网络返回的 response 对象,生产onSuccess回调中需要的数据对象
* 这里的解析工作不同的业务逻辑基本都不一样,所以需要自己实现,以下给出的时模板代码,实际使用根据需要修改
*/
@Override
public T convertResponse(Response response) throws Throwable {
//详细自定义的原理和文档,看这里: https://github.com/jeasonlzy/okhttp-OkGo/wiki/JsonCallback
/*
* 一般直接 new JsonCallback 会直接用无参构造器,但是无参构造器不能带有Bean类类型,
* 无参的Bean类类型在泛型T中已传入,所以在这里先判断一下,如果为空,就获取一下。
*/
if (type == null) {
if (clazz == null) {
Type genType = getClass().getGenericSuperclass();
type = ((ParameterizedType) genType).getActualTypeArguments()[0];
}
}
ResponseBody body = response.body();
if (body == null) return null;
T data = null;
Gson gson = new Gson();
JsonReader jsonReader = new JsonReader(body.charStream());
if (type != null) data = gson.fromJson(jsonReader, type);
if (clazz != null) data = gson.fromJson(jsonReader, clazz);
return data;
}
}
主要的地方看注释。
平常大家在使用OKGO时候会 okgo.<Bean类>post/git .....................
这个Bean类在大家 new JsonCallBack 时候会作为泛型T传入,主要是因为大家只直接用无参构造器。