实例化ViewModel的三种方式及对比

private val vm : DemoViewModel by viewModels()

private val vm2 by lazy {
    ViewModelProvider(this).get(DemoViewModel::class.java)
}

private val vm3 by lazy {
    WeakReference(DemoViewModel()).get()
}

在 Android 开发中,三种方式用于获取 ViewModel 实例的区别在于它们的创建方式、生命周期管理、内存泄漏风险,以及对代码的影响。

  1. by viewModels():

    • 创建方式:通过 by viewModels() 委托,系统会自动处理 ViewModel 的创建和销毁。
    • 生命周期管理ViewModel 的生命周期与 Activity 或 Fragment 绑定,当 Activity 或 Fragment 被销毁时,与之关联的 ViewModel 也会被自动清理。
    • 内存泄漏风险:没有内存泄漏的风险,因为 ViewModel 的生命周期由系统管理。
    • 代码影响:使代码更简洁,只需声明即可自动处理 ViewModel 的创建和销毁。
  2. ViewModelProvider:

    • 创建方式:需要手动调用 ViewModelProvider 的 get 方法并传入 ViewModel 类。
    • 生命周期管理ViewModelProvider 不会自动管理 ViewModel 的生命周期,需要手动处理。
    • 内存泄漏风险:可能导致内存泄漏,因为需要手动处理 ViewModel 的生命周期。
    • 代码影响:代码相对繁琐,需要手动处理 ViewModel 的创建和销毁。
  3. WeakReference:

    • 创建方式:使用 WeakReference 创建 ViewModel 实例时,会将 ViewModel 包装在一个弱引用对象中。
    • 生命周期管理WeakReference 不会持有 ViewModel 的强引用,因此可以避免内存泄漏。
    • 内存泄漏风险:内存泄漏风险较低,因为 WeakReference 不会持有 ViewModel 的强引用。
    • 代码影响:代码相对复杂,需要手动处理 WeakReference 的创建和获取。

综上所述,推荐使用 by viewModels() 委托来创建 ViewModel 实例,因为它可以更好地管理 ViewModel 的生命周期,避免内存泄漏的风险,并且使代码更简洁。而 ViewModelProviderWeakReference 的方式虽然也可以创建 ViewModel 实例,但它们存在内存泄漏的风险,且代码相对繁琐。

你可能感兴趣的:(开发语言,kotlin)