由于最近学习okHttp 这个开源框架,异步请求接口的CallBack是不支持泛型的,有没有什么办法扩展一下,使用的时候只需要传入一个url 一个 T 就直接得到解析后的实体对象. 把解析的过程对调用者透明, 当然已经有很好的解决方案了.有兴趣可以看看 Retrofit
当然,我想说的是如何自己扩展一下这个回调的接口
回调接口很简单,只有2个方法
public interface Callback {
void onFailure(Call call, IOException e);
void onResponse(Call call, Response response) throws IOException;
}
实现这个接口,并通过Gson 解析数据
public abstract class MyCallBack<T> implements Callback {
private Class clazz;
private Gson gson;
/**
* 必须传入泛型对应的 T.class
* @param clazz
*/
public MyCallBack(Class clazz) {
this.clazz = clazz;
gson = new Gson();
}
@Override
public void onFailure(Call call, IOException e) {
onError(e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String json = response.body().string();
try {
T t = (T) gson.fromJson(json, clazz);
onSuccess(t);
} catch (Exception e) {
}
}
public abstract void onSuccess(T t);
public abstract void onError(IOException e);
}
调用
private void RequestData(String url) {
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
okHttpClient.newCall(request).enqueue(new MyCallBack<User>(User.class) {
@Override
public void onSuccess(User user) {
}
@Override
public void onError(IOException e) {
}
});
}
ps: 一定要传入T.class(T代表泛型类) 在MyCallBack 的onResponse对应数据的转换