我有一个 ViewModel
它的属性为 LiveData<UserData>
,从Room数据库中读取。
其代码如下。
class UserDataViewModel(application: Application) : AndroidViewModel(application) {
private val userDataDao: UserDataDao = AppDatabase.getInstance(application).dao()
val userData: LiveData<UserData?> = userDataDao.getUserData()
}
在相关的活动中,我得到了一个视图模型的引用。
private val viewModel: UserDataViewModel by viewModels()
在该活动中,我需要获取视图模型的值。UserData
点击按钮时的数据。
private fun handleClick(view: View) {
viewModel.userData.value?.let {
// do stuff if the userData is present
}
}
理论上讲,除非用户在数据加载之前按下按钮,否则这个值永远不会是空的。
然而,在代码中,对 viewModel.userData.value
始终为空,而 let
块永远不会执行。
但是 如果我在 onCreate
జజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజ let
在点击处理程序中的块按要求执行:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel.userData.observe(this, Observer {
// do nothing
})
}
我的问题是:为什么我需要调用观察函数,即使我什么都不做的变化事件,以获得有效的响应从 LiveData::getValue
?
我的问题是:为什么我需要调用观察函数,即使我什么都不做的变化事件,也要从LiveData::getValue中获得有效的响应?
因为 ComputableLiveData
只有当LiveData至少有一个活跃的观察者时,才会执行从Room DAO返回的查询(在 LiveData.onActive()
). 然后它在不同的线程上异步运行,在未来的某个时间点,它将被发布到LiveData中。
你不需要调用 observe()
以便让LiveData放弃一个非null的值。 LiveData最初总是包含和产生null,直到有东西设置它的值。 如果你不想要这个初始的null值,那么在将LiveData提供给任何其他组件之前,你应该立即将其设置为其他值。 如果你想知道它什么时候第一次包含一个非空值,你将需要使用一个观察者。