Android ViewModel是Android Jetpack组件库中的一个组件,在Android MVVM模式中被广泛使用。ViewModel的主要特性是以注重生命周期的方式存储和管理数据。这种特性体现在ViewModel与Android组件(Activity、Fragment和Service)的生命周期相绑定,在组件的生命周期中ViewModel的数据会一直保存在内存中,即便是在系统配置变更时也会存在。
与UI层低耦合
在MVVM模式中,数据和业务逻辑可以集中在ViewModel中处理,实现功能时只需要在ViewModel中关注数据和业务即可,不需要和UI或者控件打交道。
Fragment间共享ViewModel
与其说是共享ViewModel,不如说是共享数据。在Android文档中有提到通过ViewModel在Fragment中共享数据,使用ViewModel共享数据可以免去Fragment之前相互回调。
数据一直保存在内存中
这个优势具体来讲是在系统配置发生变化导致Activity重建时,ViewModel还是会保持在内存中。在一些场景中可以通过这种方式避免重复加载数据。
在分析ViewModel的工作原理之前,我们最好带着问题去分析。
-
ViewModel如何被创建的,在什么时候被销毁;
-
ViewModel的生命周期如何与组件生命周期绑定;
-
为什么Activity重建时ViewModel的数据没有丢失;
-
Fragment之前如何共享ViewModel;
ViewModel的创建与销毁
ViewModel的创建
分析ViewModel的创建自然是从ViewModel初始化的地方开始。
viewModel = ViewModelProvider(this).get(TestViewModel::class.java)
ViewModel的初始化很简单,通过ViewModelProvider就可以获取到ViewModel实例。那么从这里入手开始分析ViewModel的创建过程。
第一步是先初始化了一个ViewModelProvider对象,所以我们先看下ViewModelProvider的构造方法;
public ViewModelProvider(@NonNull ViewModelStoreOwner owner) {
this(owner.getViewModelStore(), o