最近在做一个相册的项目, 会有这么一个场景,就是相册列表点击图片进入大图, 如何共享查询后的相册数据。 考虑到有三种方式:
- 1、Intent 传参
这种方式缺点很明显,数据过大,binder 直接拦截抛出异常。 - 2、静态的变量存储
缺点:容易造成内存泄漏,而且相册列表查询是处于后台一直查询状态,所以,还会有并发风险。 - 3、Jetpack 中ViewModel 的共享。
这种好处再与不需要处理生命周期的问题,因为ViewModel 的生命周期会比组件Activity 的长,所以在关联所有的Activity 关闭后,ViewModel 才会走Clear 方法清空所有数据。
使用方法:
open fun <T : ViewModel> createViewModel(activity: FragmentActivity?, cls: Class<T>?): T {
return ViewModelProvider(activity!!)[cls!!]
}
- Step2 创建Activity1 绑定ViewModel,并将当前activity 的引用静态化
viewModel = createViewModel(this, modelClass as Class<VM>)
binding?.setVariable(viewModelId, viewModel)
companion object {
var activity: NormalGalleryActivity? = null
}
override fun onCreate(savedInstanceState: Bundle?) {
activity = this
}
- Step3 创建Activity2 共享ViewModel,并绑定到当前activity
使用上一个Activity的引用去获取已经创建过的ViewModel 实例
private val normalModel = NormalGalleryActivity.activity?.viewModels<NormalGalleryViewModel>()?.value
binding?.model = normalModel
以上最关键的是 activity 的引用以及 viewModels的使用
而viewModels 需要在buildGradle 中引用
api "androidx.activity:activity-ktx:1.6.0-alpha01"
代码只贴出了关键部分,如果需要看全,可以去我的github 中查看。
|