这是在 Android 应用程序上重试 API 调用的按钮的正确方法吗?

我正在处理的项目从中间没有 Room 的 API 获取用户列表(仅网络架构)。我实际上让代码按照我想要的方式工作,但我想知道这是否是正确的方法。下面我正在标记我有疑问的地方。


我的 UI 是由 ListAdapter 支持的 RecyclerView。我有一个 ViewModel (mainViewModel) 正在观察 Repository 类提供的用户列表,还有一个布尔值来显示或不显示“再试一次”按钮。


在 MainActivity.java 我有


// Observing the boolean that represents if the api call failed

mainViewModel.getCallFailure().observe(this, new Observer<Boolean>() {

    @Override

    public void onChanged(Boolean aBoolean) {

        if (aBoolean) {

            tryAgainButton.setVisibility(View.VISIBLE);

        } else {

            tryAgainButton.setVisibility(View.GONE);

        }

    }

});


// Setting up onClickListener

tryAgainButton.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

        mainViewModel.retryCall(); // HERE IS WHERE I'M HAVING DOUBTS

    }

});


MainViewModel.java 有


public class MainViewModel extends ViewModel {


    ...


    public LiveData<Boolean> getCallFailure(){

        return userRepo.getCallFailure();

    }


    // THIS IS THE METHOD I'M CALLING FROM THE UI

    public void retryCall(){

        userRepo.getRetryCallback();

    }

}

最后,Repository.java 是


public class Repository {

    private Call<UsersResponse> retryCall;

    private Callback<UsersResponse> callback;

    private final MutableLiveData<Boolean> callFailure = new MutableLiveData<>();


    public LiveData<List<UserModel>> getListUsers(){

        final MutableLiveData<List<UserModel>> users = new MutableLiveData<>();

        callFailure.setValue(false);


        (Api.getClient().getUsersList()).enqueue(new Callback<UsersResponse>() {

            @Override

            public void onResponse(Call<UsersResponse> call, Response<UsersResponse> response) {

                users.setValue(response.body().getUsersList());

                callFailure.setValue(false);

            }



我试图只提及我认为相关的代码,我管理 ProgressDialog 的方式与我callFailure在存储库中处理布尔值的方式相同,并且它正在创造奇迹。但老实说,在 MainActivity.java 文件中进行调用感觉有些mainViewModel.retryCall();不对劲,我非常感谢任何建议!


繁花如伊
浏览 91回答 1
1回答

拉丁的传说

在我使用 MVVM 制作的项目中,我的活动和片段通知我的 ViewModel,就像你公开(通过调用一个像触发器一样的方法)并通过 LiveData 观察结果。对我来说奇怪的一件事是您的存储库存储了一部分状态(重试和失败)。在我的项目中,我将此逻辑放在 ViewModel 中,并且我的存储库在这里执行简单的操作(如网络调用)。但这更多的是个人选择。编辑:这是我根据您的代码执行此操作的方法(也许存在更好的方法)。基本上,我更喜欢在 ViewModel 中管理 LiveData 对象而不是在存储库中,因为在我看来,存储库层只是应用程序和数据(在网络中或数据库中)以及 UI 状态之间的桥梁(如重试按钮可见性)必须由 ViewModel 管理。存储库.java:public class Repository {&nbsp; &nbsp; public void getListUsers(Callback<UserResponse> callback) {&nbsp; &nbsp; &nbsp; &nbsp; (Api.getClient().getUsersList()).enqueue(callback);&nbsp; &nbsp; }}MainViewModel.java:public class MainViewModel extends ViewModel {&nbsp; &nbsp; ...&nbsp; &nbsp; private final MutableLiveData<Boolean> callFailure = new MutableLiveData<>();&nbsp; &nbsp; private final MutableLiveData<List<UserModel>> users = new MutableLiveData<>();&nbsp; &nbsp; public LiveData<Boolean> getCallFailure() {&nbsp; &nbsp; &nbsp; &nbsp; return callFailure;&nbsp; &nbsp; }&nbsp; &nbsp; public LiveData<Boolean> getUsers() {&nbsp; &nbsp; &nbsp; &nbsp; return users;&nbsp; &nbsp; }&nbsp; &nbsp; // THIS IS THE METHOD I'M CALLING FROM THE UI&nbsp; &nbsp; public void retryGetUsers() {&nbsp; &nbsp; &nbsp; &nbsp; callFailure.setValue(false);&nbsp; &nbsp; &nbsp; &nbsp; getUsers();&nbsp; &nbsp; }&nbsp; &nbsp; private void getUsers() {&nbsp; &nbsp; &nbsp; &nbsp; userRepo.getListUsers(new Callback<UserResponse>(){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void onResponse(Call<UsersResponse> call, Response<UsersResponse> response) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; users.setValue(response.body().getUserList());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void onFailure(Call<UsersResponse> call, Throwable t) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; callFailure.setValue(true);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java