【问题标题】:Toast message inside MutableLiveData.observe() working repeatedlyMutableLiveData.observe() 中的 Toast 消息重复工作
【发布时间】:2020-10-23 15:42:03
【问题描述】:

我有一个register form,我想根据注册成功与否向用户显示一条消息。我将该消息存储在我的视图模型中,该视图模型具有一个可变的实时数据对象来存储该消息并观察该对象从我的活动中。我的问题是当我第一次单击注册按钮时它正常工作,按预期显示带有我的消息的 Toast 但是当我再次单击该按钮时,Toast 消息显示我的消息两次。我真的不明白出了什么问题用我的代码。这是我的代码。

注册活动

  mViewModel = new ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication())).get(RegisterActivityViewModel.class);
  mRegisterBtn.setOnClickListener(v -> {
        register();
    }); 
   private void register() {
    if (!GenericMethods.checkInputField(mKadi) || !GenericMethods.checkInputField(mEmail)
            || !GenericMethods.checkInputField(mPAss)) {
        Toast.makeText(this, "Alanlar boş geçilemez", Toast.LENGTH_SHORT).show();
        return;
    }
    signup();
}
    private void signup(){
    kAdi = mKadi.getText().toString().trim();
    email = mEmail.getText().toString().trim();
    parola = mPAss.getText().toString().trim();
    parolaTekrari = mValidpass.getText().toString().trim();
    il=mIlTv.getText().toString().trim();
    ilce=mIlceTv.getText().toString().trim();
    getRadioValue(mRadioGroup);
    üniversite=mUniTv.getText().toString().trim();
    User user = new User(kAdi,email,parola,cinsiyet,il,ilce,üniversite);
    mViewModel.signup(user);
    mViewModel.signupData.observe(this,status ->{
       Toast.makeText(RegisterActivity.this, status, Toast.LENGTH_SHORT).show();
   });
}

注册ActivityViewModel

public MutableLiveData<String> signupData = new MutableLiveData<>();

private String statusString=null;

public void fetchFromRemote() {
    isLoading.setValue(true);
    disposable.add(RetroService.getInstance().getIller()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeWith(new DisposableSingleObserver<List<Response>>() {
                @Override
                public void onSuccess(@NonNull List<Response> responses) {
                    isLoading.setValue(false);
                    adresList.setValue(responses);
                }
                @Override
                public void onError(@NonNull Throwable e) {
                    isLoading.setValue(false);
                }
            }));
}

public void signup(User user) {
    Repo.getInstance().signup(user)
            .enqueue(new Callback<Void>() {
                @Override
                public void onResponse(Call<Void> call, retrofit2.Response<Void> response) {

                    if (response.code() == 200) {
                    statusString="Success!";
                    } else if (response.code() == 400) {
                    statusString="email already exists";
                    }
                    signupData.setValue(statusString);
                }
                @Override
                public void onFailure(Call<Void> call, Throwable t) {
                    signupData.setValue(t.getMessage());
                }
            });

}

@Override
protected void onCleared() {
    super.onCleared();
    disposable.clear();
}

【问题讨论】:

    标签: java android android-livedata android-viewmodel


    【解决方案1】:

    因为“注册”函数每次被调用时都会创建一个新的观察者。这是观察者:

    Observer<String> signupDataObserver = status -> {
        Toast.makeText(RegisterActivity.this, status, Toast.LENGTH_SHORT).show();
    }
    

    每次点击按钮时,该函数都会在 MutableLiveData "signUpData" 上添加一个新的观察者:

    mViewModel.signupData.observe(this, signupDataObserver);
    

    因此,如果您将“observe”函数移到“OnCreateView”事件中,问题应该会得到解决,因为在创建视图时片段将仅注册 1 个观察者,而不是在单击按钮时。另一种选择是在 toast 消息传递后删除观察者:

    Observer<String> signupDataObserver = status -> {
        Toast.makeText(RegisterActivity.this, status, Toast.LENGTH_SHORT).show();
        mViewModel.signupData.removeObserver(signupDataObserver);
    }
    
    mViewModel.signupData.observe(this, signupDataObserver);
    

    【讨论】:

    • 非常感谢。
    猜你喜欢
    • 2011-06-09
    • 2020-07-30
    • 2017-12-17
    • 2017-10-14
    • 2011-07-15
    • 2014-07-08
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多