在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实例)

因此,使用像视图模型这样的对象的延迟初始化可以减少片段的启动影响,这会导致加载和显示其内容更快,而不是直接初始化它们。


以上是在android中使用“byviewModels()”与“ViewModelProvider(this).get(ViewModel::class.java)”来查看模型初始化的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>