实时数据被多次调用?

我在我的应用程序中使用Android Architecture Components 。 在我的login活动中,当login失败时,我显示一个对话框!

由于实时数据,该对话框已显示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 

UPDATE

使用SingleLiveEvent后。 它没有被观察到。 你能告诉我什么是错误的代码?

更新了ViewModel

 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; } } 

Solutions Collecting From Web of "实时数据被多次调用?"

ViewModel的作用是表示视图的当前状态。 LiveData增加了观察状态变化的能力。 您正在将您的LiveData对象视为一种将响应传递给调用进行身份validation的方式。 相反,您的身份validation方法应该简单地将凭据作为参数,决定是否login人员,如果您这样做,更新LiveData ViewModel以反映该人员login,然后观察员将得到这个,最有可能解雇此视图并显示您想要显示的身份validation状态的其他部分(例如LoggedInUsername)。

总之:

  • 创build一个名为CurrentAuthenticatedSession的类或者其他的东西,例如一个用户名字段,并且以null开头
  • 当进行validation呼叫时,validation查找用户信息
  • 如果它是当前更新CurrentAuthenticatedSession的LiveData实例
  • 有'currentlyLoggedInUser'字段正在侦听此对象的更新
  • 将该控件的文本设置为字段用户名的值

这是一个方法。 由于login屏幕是暂时的,状态更新的观察者可能被视为多余的。 但这就是ViewModel / LiveData机制的工作原理。