android - 为什么 LiveData.getValue 除非调用 observe 才会返回 null?

标签 android kotlin android-room android-lifecycle android-livedata

我有一个 ViewModel它具有 LiveData<UserData> 类型的属性,正在从 Room 数据库中读取。

其代码如下:

class UserDataViewModel(application: Application) : AndroidViewModel(application) {

    private val userDataDao: UserDataDao = AppDatabase.getInstance(application).dao()
    val userData: LiveData<UserData?> = userDataDao.getUserData()

}

在关联的 Activity 中,我获得了对 View 模型的引用:

private val viewModel: UserDataViewModel by viewModels()

在该 Activity 中,我需要获取 UserData 的值单击按钮:

private fun handleClick(view: View) {
    viewModel.userData.value?.let {
        // do stuff if the userData is present
    }
}

现在理论上,除非用户在数据加载之前按下按钮,否则它永远不应该为 null。

但是,就代码而言,对 viewModel.userData.value 的调用始终为空,let block 永远不会执行。

但是,如果我在 onCreate 中添加这条语句, let点击处理程序中的 block 根据需要执行:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    viewModel.userData.observe(this, Observer {
        // do nothing
    })
}

我的问题是:为什么我需要调用 observe 函数来从 LiveData::getValue 获得有效响应,即使我对更改事件什么也不做? ?

最佳答案

My question is: why do I need to call the observe function, even if I'm doing nothing with a change event, to get valid responses from LiveData::getValue?

因为从 Room DAO 返回的 ComputableLiveData 只有在 LiveData 有至少一个活跃的观察者(在 LiveData.onActive() 内)时才会执行查询。然后它在不同的线程上异步运行,并在将来的某个时候将它发布到 LiveData 中。

关于android - 为什么 LiveData.getValue 除非调用 observe 才会返回 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61565175/

相关文章:

android - 带有 ListView 子级的可滚动父级

android - 线程在旋转时使 Activity 粉碎

android - QVideoFrame::map() 崩溃

kotlin - Kotlin将FileTime转换为日,月,年

java - 如何使用 viewModel 中的观察者方法解决 "anonymous class derived from observer"错误

android - 如何解决歧义方法?

android - 将房间数据库导出到 json 文件

Android 使用 super 用户权限?允许访问

android - Kotlin - 伴生对象 fun 有什么作用?

android - 如何重置组合 View 动画的状态