Andorid 对非泛型接口扩展支持泛型

来源:互联网 发布:快手外星人知乎 编辑:程序博客网 时间:2024/05/29 16:47



由于最近学习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对应数据的转换

0 0
原创粉丝点击