我有一个使用ViewModel架构组件的活动:
class RandomIdViewModel : ViewModel() {
var currentId : MutableLiveData<String?> = MutableLiveData()
init {
currentId.value = UUID.randomUUID().toString()
}
}
然后在我的活动中,我在 onCreate()方法中有这个:
viewModel = ViewModelProviders.of(this).get(RandomIdViewModel::class.java)
viewModel.currentId.observe(this, idObserver)
每次旋转手机时,ID都会发生变化。因此,当我设置viewModel对象时,为什么调用init时我感到很困惑。
修改
我一直在关注saving state UI guidelines,看起来ViewModel肯定会在整个简单的配置更改中维护它的数据:
ViewModel非常适合在用户积极使用应用程序时存储和管理与UI相关的数据。它允许快速访问UI数据,并帮助您避免在旋转,窗口大小调整和其他常见配置更改中从网络或磁盘中重新获取数据。 ...
ViewModel非常适合在用户积极使用应用程序时存储和管理与UI相关的数据。它允许快速访问UI数据,并帮助您避免在旋转,窗口大小调整和其他常见配置更改中从网络或磁盘中重新获取数据
答案 0 :(得分:0)
看起来在活动中拥有一个全局变量会将ViewModel的引用存储为一次性导致问题。所有示例似乎都在局部变量中使用VM,这对我不起作用(我不希望我的观察者被内联声明,因为它开始使代码非常混乱 1 )。每次发生配置更改时,局部变量似乎都会获得一个新实例。但是,如果我创建一个方法:
private fun viewModel() = ViewModelProviders.of(this).get(RandomIdViewModel::class.java)
我每当需要VM时都会调用它。我认为这是一个很有可能在将来解决的错误。
1 作为旁注,我还需要指出,当活动没有使用时我也必须删除我的观察者。这是另一个原因,我不能只是在不同的生命周期事件中内联观察者的定义:
override fun onResume() {
super.onResume()
viewModel().currentId.observe(this, idObserver)
}
override fun onPause() {
viewModel().currentId.removeObserver(idObserver)
super.onPause()
}