【问题标题】:How to avoid creating different callback interface for each retrofit response如何避免为每个改造响应创建不同的回调接口
【发布时间】:2021-03-06 18:02:40
【问题描述】:

我想从活动中提取改造请求实施。所以我想到了创作 发出所有请求并通过接口将结果发送到活动的类。

我为响应回调创建了一个接口,如下所示

public interface IApi {

    void onSuceessTodo(Todo todo);
    void onSuceessPosts(List<Post> postList);
    void onFailure(String errorMessage);
}

我已经创建了一个存储库类。它发出两个不同的请求

public class Repository {

    public void getPosts (IApi iApi) {
        JsonPlaceHolderApi jsonPlaceHolderApi = retrofit.create(JsonPlaceHolderApi.class);
        Call<List<Post>> call = jsonPlaceHolderApi.getPosts();
        call.enqueue(new Callback<List<Post>>() {
            @Override
            public void onResponse(Call<List<Post>> call, Response<List<Post>> response) {
                if (!response.isSuccessful()) {
                    iApi.onFailure("Not successful");
                    return;
                }

                List<Post> posts = response.body();
                iApi.onSuceessPosts(posts);
            }

            @Override
            public void onFailure(Call<List<Post>> call, Throwable t) {
                iApi.onFailure(t.toString());
            }
        });
    }

    public void getTodos (IApi iApi , int id) {
        JsonPlaceHolderApi jsonPlaceHolderApi = retrofit.create(JsonPlaceHolderApi.class);
        Call<Todo> call = jsonPlaceHolderApi.getTodo(id);
        call.enqueue(new Callback<Todo>() {
            @Override
            public void onResponse(Call<Todo> call, Response<Todo> response) {
                if (!response.isSuccessful()) {
                    iApi.onFailure("Not successful");
                    return;
                }

                Todo todo = response.body();
                iApi.onSuceess(todo);

            }

            @Override
            public void onFailure(Call<Todo> call, Throwable t) {
                iApi.onFailure(t.toString());
            }
        });
    }
 }

现在在活动中,我正在实现回调接口。但是对于这个活动,我只需要得到Todo 而不是Posts,所以我重写了所需的函数并将活动设为抽象,但我在运行应用程序时遇到了问题

ava.lang.RuntimeException: Unable to instantiate activity 

我认为是因为我不能将活动抽象类,并且我不想为每个请求调用创建多个接口,因为我会有很多!

活动

public abstract class MainActivity extends AppCompatActivity implements IApi{
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Repository repository = new Repository();
        repository.getTodos(this , 1);

    }

    @Override
    public void onSuceessTodo(Todo todo) {
        Log.d("test" , "onSuceess");
    }


    @Override
    public void onFailure(String errorMessage) {
        Log.d("test" , "onFailure");

    }
}

解决办法是什么?

【问题讨论】:

    标签: java android android-activity retrofit repository-pattern


    【解决方案1】:

    试试这个:

    1. 创建一个抽象类BaseActivity,如下所示:
    public abstract class BaseActivity extends AppCompatActivity implements IApi
    
    1. 在您的 BaseActivity 中创建抽象方法
    public abstract void onSuceessTodo(Todo todo) {
        Log.d("test" , "onSuceess");
    }
    
    public abstract void onFailure(String errorMessage) {
        Log.d("test" , "onFailure");
    
    }
    
    public abstract void onSuceessTodo(String errorMessage) {
        Log.d("test" , "onFailure");
    
    }
    
    1. 您的 MainActivity 类应该是这样的
    public class MainActivity extends BaseActivity
    
    1. 覆盖您只需要在 MainActivity 类中覆盖的方法

    告诉我这是否适合你! (对不起我糟糕的 Java ✌️)

    【讨论】:

    • 我相信这会奏效。但我觉得将这些函数放在 baseActivity 上没有意义
    • 如果您将这些方法放在 BaseActivity 中,您可以为从该 BaseActivity 继承的所有活动定义标准行为,或者至少有一个基本实现,您可以在继承自的每个特定 Activity 中覆盖它这个 BaseActivity。 @Rahul
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 2020-06-19
    • 2019-05-09
    相关资源
    最近更新 更多