【问题标题】:Retrofit Custom Callback Generic Type改造自定义回调通用类型
【发布时间】:2018-04-06 13:23:50
【问题描述】:

我正在扩展默认的 Retrofit 2 回调:

abstract class APICallback<T> implements Callback<T> {

    @Override
    public void onResponse(Call<T> call, Response<T> response) {
        if (!response.isSuccessful()) {
            // Cast response.body() to my POJO class, results in null
            MyClass myClass = (MyClass) response.body();
        }
    }

    @Override
    public void onFailure(Call<T> call, Throwable t) {
        // TODO ...
    }
}

如何将响应的泛型类型向下转换为我自己的类? 这个过程应该是自动的吗?我正在为客户端使用 GsonConverter。

【问题讨论】:

    标签: java android generics retrofit retrofit2


    【解决方案1】:

    我认为你必须修改 AdapterFactory 然后注册改造

    public class APICallAdapterFactory extends CallAdapter.Factory {
    
    @Nullable
    @Override
    public CallAdapter<?, ?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) {
        final Type responseType = ((ParameterizedType) returnType).getActualTypeArguments()[0];
        return new CallAdapter<Object, Object>() {
            @Override
            public Type responseType() {
                return responseType;
            }
    
            @Override
            public Object adapt(Call<Object> call) {
                return new APICallAdapter<>(call);
            }
        };
    }
    

     private static Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(APIService.baseUrl)
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(new APICallAdapterFactory())
            .build();
    

    【讨论】:

    • 在此处添加该链接的摘要并用一些示例代码进行演示。
    • 好的,我修好了 :) @Satendra
    • 虽然这很旧,但您最近发布了一个(现已删除)NAA,其中包含指向该博客的链接。根据您的个人资料,那是您的博客。因此,作为一个友好的提醒,请记住,每当您链接到自己的博客时,您都需要添加披露信息。此外,过度的自我推销也会使您的帖子面临被标记为垃圾邮件的风险。见how not to be a spammer
    【解决方案2】:

    你可以这样处理

    Gson gson = new Gson();
    MyClass myClass = gson.fromJson(response.body(), MyClass.class);
    

    【讨论】:

    • 不应该通过我添加到改造设置中的 GsonConverter 自动完成吗?
    • 没有。你必须在 gradle 依赖中添加这个,你应该在 Response response 中写 JsonElement 而不是你的类
    【解决方案3】:

    将 T 替换为 MyClass

    class APICallback implements Callback<MyClass> {
    
        @Override
        public void onResponse(Call<MyClass> call, Response<MyClass> response) {
            if (response.isSuccessful()) {
                // Cast response.body() to my POJO class, results in null
                 MyClass myClass = response.body();
            }
        }
    
        @Override
        public void onFailure(Call<MyClass> call, Throwable t) {
    
        }
    }
    

    【讨论】:

    • 我做不到,我覆盖了一个泛型类型。
    • remove abstract & "!"(response.isSuccessful()),使用上面更新的代码工作正常
    • 请检查我在下面提供的答案
    猜你喜欢
    • 1970-01-01
    • 2018-06-02
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 2012-10-19
    • 1970-01-01
    相关资源
    最近更新 更多