在android中使用“byviewModels()”与“ViewModelProvider(this).get(ViewModel::class.java)”来查看模型初始化
我们可以ViewModel使用初始化类
private val viewModel: CharactersViewModel by viewModels()
或者
viewModel = ViewModelProvider(this).get(CharactersViewModel::class.java)
这里的 CharactersViewModel 是我们的 ViewModel 类。我的问题是什么时候使用哪个?两者都包含相同的目的吗?我已经阅读了 ViewModel 的 android 官方文档。文档说by viewModels()Kotlin 属性委托。但可惜没能看懂。任何人都可以帮助我理解这一点吗?
回答
两者都做同样的事情,但对第一个有区别优势。Kotlin 属性委托使用Lazy Initialization. 在维基百科上,您可以找到它的简要定义:
在计算机编程中,延迟初始化是一种将对象的创建、值的计算或其他一些昂贵的过程延迟到第一次需要它的策略。它是一种惰性求值,特指对象或其他资源的实例化。
因此,当您使用您提到的第一种方法时,您就利用了惰性属性。这意味着只有在第一次访问时才会创建 ViewModel 实例。
以下面的代码为例:
class YourFragment : Fragment() {
private val viewModel: CharactersViewModel by viewModels()
// other codes ...
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// doing some view initialization ...
viewModel.someLiveData.observe(viewLifecycleOwner) {
// ...
}
}
}
如果viewModel.someLiveData.observe(viewLifecycleOwner)是第一次viewModel触摸该字段,它的实例化将在那里发生。(创建CharactersViewModel实例)
因此,使用像视图模型这样的对象的延迟初始化可以减少片段的启动影响,这会导致加载和显示其内容更快,而不是直接初始化它们。
THE END
二维码