实例化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 实例,但它们存在内存泄漏的风险,且代码相对繁琐。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值