我们的团队在开发当前应用程序时正在使用ViewModel
和LiveData
组件。在单击Button
的一种情况下,我们正在启动网络API调用。
只要API结果可用,Repository
就会返回LiveData
。
在ViewModel
中,仅当单击Observer
时才附加Button
,由于我们在ViewModel
中,因此我们正在使用observeForever()
这是代码;
//ViewModel Code
//Api Observer
var apiObserver: Observer<ApiState> =
Observer { response ->
when (response.currentState) {
StateConstants.STATE_API_CALLED -> showLoading()
StateConstants.STATE_API_COMPLETE -> stopLoading()
StateConstants.STATE_DATA_LOADED -> processResponseData(response.data)
StateConstants.STATE_API_ERROR -> showError(response.errorMessage)
}
}
fun sendReminderToCustomer() { //This method is called on Button click from XML
repo.apiStateLiveData.observeForever(apiObserver) //attach Observer and Observe Forever
repo.sendReminderDetails() //make api call
}
override fun onCleared() {
super.onCleared()
repo.apiStateLiveData.removeObserver(apiObserver) //remove Observer
}
由于每次单击按钮,我们都会在LiveData
上附加相同的观察者,否则会有未知的副作用,例如
LiveData
观察者列表中吗?onChanged()
方法也会被多次调用吗?是和是。确保仅添加一次观察者(例如,在viewModel的init
中)