亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

這是在 Android 應用程序上重試 API 調用的按鈕的正確方法嗎?

這是在 Android 應用程序上重試 API 調用的按鈕的正確方法嗎?

繁花如伊 2022-10-26 17:26:25
我正在處理的項目從中間沒有 Room 的 API 獲取用戶列表(僅網絡架構)。我實際上讓代碼按照我想要的方式工作,但我想知道這是否是正確的方法。下面我正在標記我有疑問的地方。我的 UI 是由 ListAdapter 支持的 RecyclerView。我有一個 ViewModel (mainViewModel) 正在觀察 Repository 類提供的用戶列表,還有一個布爾值來顯示或不顯示“再試一次”按鈕。在 MainActivity.java 我有// Observing the boolean that represents if the api call failedmainViewModel.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 onClickListenertryAgainButton.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();不對勁,我非常感謝任何建議!
查看完整描述

1 回答

?
拉丁的傳說

TA貢獻1789條經驗 獲得超8個贊

在我使用 MVVM 制作的項目中,我的活動和片段通知我的 ViewModel,就像你公開(通過調用一個像觸發器一樣的方法)并通過 LiveData 觀察結果。


對我來說奇怪的一件事是您的存儲庫存儲了一部分狀態(重試和失?。?。在我的項目中,我將此邏輯放在 ViewModel 中,并且我的存儲庫在這里執行簡單的操作(如網絡調用)。但這更多的是個人選擇。


編輯:這是我根據您的代碼執行此操作的方法(也許存在更好的方法)。


基本上,我更喜歡在 ViewModel 中管理 LiveData 對象而不是在存儲庫中,因為在我看來,存儲庫層只是應用程序和數據(在網絡中或數據庫中)以及 UI 狀態之間的橋梁(如重試按鈕可見性)必須由 ViewModel 管理。


存儲庫.java:


public class Repository {

    public void getListUsers(Callback<UserResponse> callback) {

        (Api.getClient().getUsersList()).enqueue(callback);

    }

}

MainViewModel.java:


public class MainViewModel extends ViewModel {


    ...


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

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


    public LiveData<Boolean> getCallFailure() {

        return callFailure;

    }


    public LiveData<Boolean> getUsers() {

        return users;

    }


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

    public void retryGetUsers() {

        callFailure.setValue(false);

        getUsers();

    }


    private void getUsers() {

        userRepo.getListUsers(new Callback<UserResponse>(){

            @Override

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

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

            }


            @Override

            public void onFailure(Call<UsersResponse> call, Throwable t) {

                callFailure.setValue(true);

            }

        });

    }

}


查看完整回答
反對 回復 2022-10-26
  • 1 回答
  • 0 關注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號