MutableLiveData.observe() 中的 Toast 消息重复工作
Toast message inside MutableLiveData.observe() working repeatedly
我有一个 register form 并且我想根据成功注册向用户显示一条消息,或者 not.I 将该消息存储在我的视图模型中,该视图模型具有要存储的可变实时数据对象该消息并从我的 activity.My 问题中观察该对象是当我第一次单击注册按钮时它正常工作,按预期显示 Toast 和我的消息但是当我再次单击该按钮时 Toast 消息显示我的消息二 times.I 真的不明白我的代码有什么问题code.Here。
注册活动
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();
});
}
RegisterActivityViewModel
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();
}
因为“register”函数每次被调用时都会创建一个新的观察者。这是观察者:
Observer<String> signupDataObserver = status -> {
Toast.makeText(RegisterActivity.this, status, Toast.LENGTH_SHORT).show();
}
每次点击按钮时,函数都会在 MutableLiveData“signUpData”上添加一个新的观察者:
mViewModel.signupData.observe(this, signupDataObserver);
因此,如果您将“观察”功能移动到“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);
我有一个 register form 并且我想根据成功注册向用户显示一条消息,或者 not.I 将该消息存储在我的视图模型中,该视图模型具有要存储的可变实时数据对象该消息并从我的 activity.My 问题中观察该对象是当我第一次单击注册按钮时它正常工作,按预期显示 Toast 和我的消息但是当我再次单击该按钮时 Toast 消息显示我的消息二 times.I 真的不明白我的代码有什么问题code.Here。
注册活动
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();
});
}
RegisterActivityViewModel
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();
}
因为“register”函数每次被调用时都会创建一个新的观察者。这是观察者:
Observer<String> signupDataObserver = status -> {
Toast.makeText(RegisterActivity.this, status, Toast.LENGTH_SHORT).show();
}
每次点击按钮时,函数都会在 MutableLiveData“signUpData”上添加一个新的观察者:
mViewModel.signupData.observe(this, signupDataObserver);
因此,如果您将“观察”功能移动到“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);