Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MutableLiveData.observe()中的Toast消息重复工作_Java_Android_Android Livedata_Android Viewmodel - Fatal编程技术网

Java MutableLiveData.observe()中的Toast消息重复工作

Java MutableLiveData.observe()中的Toast消息重复工作,java,android,android-livedata,android-viewmodel,Java,Android,Android Livedata,Android Viewmodel,我有一个和ı想根据注册成功与否向用户显示一条消息。我将该消息存储在我的视图模型中,该视图模型有一个可变的实时数据对象来存储该消息,并从我的活动中观察该对象。我的问题是当ı第一次单击注册按钮时,它工作正常,按预期用我的消息显示Toast,但当再次单击该按钮时,Toast消息显示我的消息两次。我真的不明白我的代码有什么问题。这是我的代码 注册活动 mViewModel = new ViewModelProvider(this, ViewModelProvider.AndroidViewModel

我有一个和ı想根据注册成功与否向用户显示一条消息。我将该消息存储在我的视图模型中,该视图模型有一个可变的实时数据对象来存储该消息,并从我的活动中观察该对象。我的问题是当ı第一次单击注册按钮时,它工作正常,按预期用我的消息显示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();
   });
}
注册表活动视图模型

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();
}
public MutableLiveData signupdatea=new MutableLiveData();
私有字符串statusString=null;
public void fetchFromRemote(){
isLoading.setValue(真);
一次性添加(RetroService.getInstance().getIller())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribowith(新的可处置SingleObserver(){
@凌驾
成功时公共无效(@NonNull列表响应){
isLoading.setValue(假);
地址列表设置值(响应);
}
@凌驾
公共无效onError(@NonNull可丢弃e){
isLoading.setValue(假);
}
}));
}
公共无效注册(用户){
Repo.getInstance().signup(用户)
.enqueue(新的回调函数(){
@凌驾
公共void onResponse(呼叫,改装2.响应){
if(response.code()==200){
statusString=“成功!”;
}else if(response.code()==400){
statusString=“电子邮件已存在”;
}
SignUpdatea.setValue(statusString);
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
SignUpdatea.setValue(t.getMessage());
}
});
}
@凌驾
已清除的受保护的void(){
super.onCleared();
一次性的;
}
因为“register”函数每次被调用时都会创建一个新的观察者。这是观察员:

Observer<String> signupDataObserver = status -> {
    Toast.makeText(RegisterActivity.this, status, Toast.LENGTH_SHORT).show();
}
因此,如果将“observe”函数移动到“OnCreateView”事件中,问题应该得到解决,因为创建视图时片段将只注册一个观察者,而单击按钮时则不会。另一种选择是在toast消息传递后删除观察者:

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

mViewModel.signupData.observe(this, signupDataObserver);
Observer signupdateaobserver=状态->{
Toast.makeText(RegisterActivity.this,status,Toast.LENGTH_SHORT.show();
mViewModel.signUpdatea.removeObserver(signUpdateAOBServer);
}
mViewModel.signupdatea.observe(this,signupdateaobserver);
因为“register”函数每次被调用时都会创建一个新的观察者。这是观察员:

Observer<String> signupDataObserver = status -> {
    Toast.makeText(RegisterActivity.this, status, Toast.LENGTH_SHORT).show();
}
因此,如果将“observe”函数移动到“OnCreateView”事件中,问题应该得到解决,因为创建视图时片段将只注册一个观察者,而单击按钮时则不会。另一种选择是在toast消息传递后删除观察者:

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

mViewModel.signupData.observe(this, signupDataObserver);
Observer signupdateaobserver=状态->{
Toast.makeText(RegisterActivity.this,status,Toast.LENGTH_SHORT.show();
mViewModel.signUpdatea.removeObserver(signUpdateAOBServer);
}
mViewModel.signupdatea.observe(this,signupdateaobserver);

非常感谢。非常感谢。