Android架构组件:ViewModel不断重新初始化

时间:2018-06-05 09:19:04

标签: android mvvm android-viewmodel

我有一个使用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数据,并帮助您避免在旋转,窗口大小调整和其他常见配置更改中从网络或磁盘中重新获取数据

1 个答案:

答案 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()
}