android-livedata - ViewModel Livedata 观察者调用轮换

标签 android-livedata android-viewmodel

在我的 View 模型中,我有两个属性:

private val databaseDao = QuestionDatabase.getDatabase(context).questionDao()
val allQuestions: LiveData<List<Question>> = databaseDao.getAllQuestions()

我在片段中设置了“allQuestions”观察者,并且我注意到当我旋转设备时观察者被调用。即使 View 模型只被创建一次(可以通过 init() 中的日志语句得知),观察者方法仍然被调用。

这是为什么呢?我认为重点是 View 模型的持久性。理想情况下,我希望数据库问题仅加载一次,无论轮换如何。

最佳答案

发生这种情况是因为 LiveData 具有生命周期感知能力。
当您旋转屏幕时,您的 UI Controller [Activity/Fragment] 会经历各种生命周期状态和生命周期回调。
由于 LiveData 具有生命周期感知能力,因此它会相应地更新详细信息。

我尝试用以下几点来解释这一点:

  1. 当 UI Controller 位于屏幕外时,实时数据不执行更新。
  2. 当 UI Controller 返回屏幕时,它会获取当前数据。
    (由于此属性,您将获得上述行为)
  3. 当 UI Controller 被销毁时,它会自行执行清理操作。
  4. UI Controller 开始观察实时数据时,它会获取当前数据。

关于android-livedata - ViewModel Livedata 观察者调用轮换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66648890/

相关文章:

android - LiveDataScope 发出不调用

android - 向 Kotlin 改造调用发送参数

android - 如何为 RangeSlider(valueFrom 和 valueTo)使用 Databinding 和 LiveData

Android ViewModel - 如何强制重新创建某些配置更改

android - ViewModel 不能在 Activity 中实例化

Java + Android Jetpack + Dagger 2 在 ViewModel 中注入(inject)

android - Dao 方法返回 List<String> 而我需要一个 Map<String,Integer>

android - 在后续的挂起方法调用之间发出 LiveData 以更新 UI

android - 当 Room 没有 LiveData 而不是从 REST API 获取时返回 LiveData 的存储库

android - 将 ViewModel 与 ViewPagers 相结合