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
实例的区别在于它们的创建方式、生命周期管理、内存泄漏风险,以及对代码的影响。
-
by viewModels()
:- 创建方式:通过
by viewModels()
委托,系统会自动处理ViewModel
的创建和销毁。 - 生命周期管理:
ViewModel
的生命周期与Activity
或Fragment
绑定,当Activity
或Fragment
被销毁时,与之关联的ViewModel
也会被自动清理。 - 内存泄漏风险:没有内存泄漏的风险,因为
ViewModel
的生命周期由系统管理。 - 代码影响:使代码更简洁,只需声明即可自动处理
ViewModel
的创建和销毁。
- 创建方式:通过
-
ViewModelProvider
:- 创建方式:需要手动调用
ViewModelProvider
的get
方法并传入ViewModel
类。 - 生命周期管理:
ViewModelProvider
不会自动管理ViewModel
的生命周期,需要手动处理。 - 内存泄漏风险:可能导致内存泄漏,因为需要手动处理
ViewModel
的生命周期。 - 代码影响:代码相对繁琐,需要手动处理
ViewModel
的创建和销毁。
- 创建方式:需要手动调用
-
WeakReference
:- 创建方式:使用
WeakReference
创建ViewModel
实例时,会将ViewModel
包装在一个弱引用对象中。 - 生命周期管理:
WeakReference
不会持有ViewModel
的强引用,因此可以避免内存泄漏。 - 内存泄漏风险:内存泄漏风险较低,因为
WeakReference
不会持有ViewModel
的强引用。 - 代码影响:代码相对复杂,需要手动处理
WeakReference
的创建和获取。
- 创建方式:使用
综上所述,推荐使用 by viewModels()
委托来创建 ViewModel
实例,因为它可以更好地管理 ViewModel
的生命周期,避免内存泄漏的风险,并且使代码更简洁。而 ViewModelProvider
和 WeakReference
的方式虽然也可以创建 ViewModel
实例,但它们存在内存泄漏的风险,且代码相对繁琐。