繁体   English   中英

Android体系结构组件:ViewModel不断重新初始化

[英]Android Architecture Components: ViewModel keeps getting re-initialised

我有一个使用ViewModel体系结构组件的活动:

class RandomIdViewModel : ViewModel() {
    var currentId : MutableLiveData<String?> = MutableLiveData()

    init {
        currentId.value = UUID.randomUUID().toString()
    }
}

然后在我的Activity中,在onCreate()方法中添加以下内容:

viewModel = ViewModelProviders.of(this).get(RandomIdViewModel::class.java)
viewModel.currentId.observe(this, idObserver)

每次旋转手机时,ID都会更改。 因此,对于设置视图模型对象时为什么要调用init感到非常困惑。

编辑

我一直在查看保存状态UI准则 ,并且看来,在进行简单的配置更改后,ViewModel显然应该维护其数据:

ViewModel非常适合在用户积极使用应用程序时存储和管理与UI相关的数据。 它允许快速访问UI数据,并帮助您避免在旋转,窗口大小调整和其他常见配置更改之间从网络或磁盘重新获取数据。 ...

ViewModel非常适合在用户积极使用应用程序时存储和管理与UI相关的数据。 它允许快速访问UI数据,并帮助您避免在旋转,调整窗口大小和其他常见配置更改时从网络或磁盘重新获取数据。

似乎在活动中有一个全局变量,该变量将对ViewModel的引用一次存储一次就导致了问题。 所有示例似乎都在局部变量中使用VM,这对我不起作用(我不希望将观察者声明为内联,因为它开始使代码变得非常混乱1 )。 每次更改配置时,本地变量似乎都会获得一个新实例。 但是,如果我创建一个方法:

private fun viewModel() = ViewModelProviders.of(this).get(RandomIdViewModel::class.java)

当我需要虚拟机时,我就称呼它。 我认为这是一个错误,将来很可能会解决。

1作为旁注,我还需要指出,当活动不使用观察者时,我还必须删除他们。 这就是为什么我不能仅仅内联观察者的定义的另一个原因,因为它们发生在不同的生命周期事件中:

override fun onResume() {
    super.onResume()
    viewModel().currentId.observe(this, idObserver)
}

override fun onPause() {
    viewModel().currentId.removeObserver(idObserver)
    super.onPause()
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM