我Android Architecture Components
在我的应用程序中使用。在我的登录活动中,登录失败时我会显示一个对话框!
由于实时数据,该对话框已显示 3 次以上。我添加了一些日志并发现它livedata
被多次调用。
我该如何解决这个问题?
活动
mViewModel.authenticate(token, binding.inputPassword.getText().toString()).observe(LoginActivity.this, apiResponse -> {
progress.dismiss();
if (apiResponse != null) {
if (apiResponse.getError() != null) {
Log.e("Login", "Network Failure");
} else {
if (apiResponse.getAuthuser().getStatus().equals("VALID")) {
PrefUtils.saveUserToPrefs(LoginActivity.this, apiResponse.getAuthuser());
finish();
} else if (apiResponse.getAuthuser().getStatus().equals("INVALID")) {
Log.e("LOGIN Issue ", "Showing Dialog" + apiResponse.getAuthuser().getStatus());
loginFailure();
}
}
}
});
视图模型
class LoginActivityViewModel extends ViewModel {
private final FarmerRepository farmerRepository;
private MediatorLiveData<ApiResponse> mApiResponse;
LoginActivityViewModel(FarmerRepository repository) {
mApiResponse = new MediatorLiveData<>();
farmerRepository = repository;
}
MediatorLiveData<ApiResponse> authenticate(String encryptedMobile, String pwd) {
mApiResponse.addSource(
farmerRepository.authenticate(encryptedMobile, pwd),
apiResponse -> mApiResponse.setValue(apiResponse)
);
return mApiResponse;
}
}
LOGCAT
11-01 00:13:31.265 24386-24386 E/LOGIN Issue: Showing DialogINVALID
11-01 00:13:31.312 24386-24386 E/LOGIN Issue: Showing DialogINVALID
11-01 00:13:37.034 24386-24386 E/LOGIN Issue: Showing DialogINVALID
11-01 00:13:38.196 24386-24386 E/LOGIN Issue: Showing DialogINVALID
11-01 00:13:38.234 24386-24386 E/LOGIN Issue: Showing DialogINVALID
11-01 00:13:38.273 24386-24386 E/LOGIN Issue: Showing DialogINVALID
更新
使用 SingleLiveEvent 之后。它没有被观察到。你能告诉我代码有什么问题吗?
更新的视图模型
class LoginActivityViewModel extends ViewModel {
private final FarmerRepository farmerRepository;
private MediatorLiveData<ApiResponse> mApiResponse;
private SingleLiveEvent<ApiResponse> mMsgUpdate;
LoginActivityViewModel(FarmerRepository repository) {
mApiResponse = new MediatorLiveData<>();
farmerRepository = repository;
mMsgUpdate = new SingleLiveEvent<>();
}
SingleLiveEvent<ApiResponse> authenticate(String encryptedMobile, String pwd) {
mApiResponse.addSource(
farmerRepository.authenticate(encryptedMobile, pwd),
apiResponse -> mMsgUpdate.setValue(apiResponse)
);
return mMsgUpdate;
}
}