调用轮换的 ViewModel Live Data 观察者
ViewModel Live Data observers calling on rotation
在我的视图模型中,我有两个属性:
private val databaseDao = QuestionDatabase.getDatabase(context).questionDao()
val allQuestions: LiveData<List<Question>> = databaseDao.getAllQuestions()
我在片段中的“allQuestions”上设置了观察器,我注意到当我旋转设备时正在调用观察器。即使视图模型只被创建一次(可以通过 init() 中的日志语句得知),观察者方法仍在被调用。
这是为什么?我认为重点是在视图模型中具有持久性。理想情况下,我希望数据库问题只加载一次,而不考虑轮换。
发生这种情况是因为 LiveData
具有生命周期意识。
当您旋转屏幕时,您 UI 控制器 [Activity/Fragment] 会经历各种生命周期状态和生命周期回调。
由于 LiveData
具有生命周期感知能力,因此它会相应地更新详细信息。
我试图用以下几点来解释这一点:
- 当 UI 控制器不在屏幕上时,
Live Data
不执行任何更新。
- 当 UI 控制器返回屏幕时,它会获取当前数据。
(因为这个 属性 你会出现以上行为)
- 当 UI 控制器被销毁时,它会自行执行清理。
- 当new UI控制器开始观察实时数据时,它获取当前数据。
在我的视图模型中,我有两个属性:
private val databaseDao = QuestionDatabase.getDatabase(context).questionDao()
val allQuestions: LiveData<List<Question>> = databaseDao.getAllQuestions()
我在片段中的“allQuestions”上设置了观察器,我注意到当我旋转设备时正在调用观察器。即使视图模型只被创建一次(可以通过 init() 中的日志语句得知),观察者方法仍在被调用。
这是为什么?我认为重点是在视图模型中具有持久性。理想情况下,我希望数据库问题只加载一次,而不考虑轮换。
发生这种情况是因为 LiveData
具有生命周期意识。
当您旋转屏幕时,您 UI 控制器 [Activity/Fragment] 会经历各种生命周期状态和生命周期回调。
由于 LiveData
具有生命周期感知能力,因此它会相应地更新详细信息。
我试图用以下几点来解释这一点:
- 当 UI 控制器不在屏幕上时,
Live Data
不执行任何更新。 - 当 UI 控制器返回屏幕时,它会获取当前数据。
(因为这个 属性 你会出现以上行为) - 当 UI 控制器被销毁时,它会自行执行清理。
- 当new UI控制器开始观察实时数据时,它获取当前数据。