Jetpack 多个Activity共享ViewModel(AndroidViewModel)

最近在做一个相册的项目, 会有这么一个场景,就是相册列表点击图片进入大图, 如何共享查询后的相册数据。
考虑到有三种方式:

  • 1、Intent 传参
    这种方式缺点很明显,数据过大,binder 直接拦截抛出异常。
  • 2、静态的变量存储
    缺点:容易造成内存泄漏,而且相册列表查询是处于后台一直查询状态,所以,还会有并发风险。
  • 3、Jetpack 中ViewModel 的共享。
    这种好处再与不需要处理生命周期的问题,因为ViewModel 的生命周期会比组件Activity 的长,所以在关联所有的Activity 关闭后,ViewModel 才会走Clear 方法清空所有数据。

使用方法:

  • Step 1 创建ViewModel
  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>)
        //关联ViewModel
        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 中查看。

猜你喜欢

转载自blog.csdn.net/Android_LeeJiaLun/article/details/127440929