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