JetPack-ViewModel

目录

  1. 简介
  2. 实现原理
  3. 讨论
  4. 参考

简介

根据官网介绍ViewModel主要作用是

The ViewModel class is designed to store and manage UI-related data in a lifecycle conscious way. The ViewModel class allows data to survive configuration changes such as screen rotations.
其生命周期如下图所示(以Activity为例,FragmentOnCreate()OnDetach()):

Activity/Fragment被认为是UI Controller, ViewModel把UI无关的逻辑操作进行封装,所以ViewModel不建议持有View/Lifecycle/Activity等对象。如果需要Context,使用AndroidViewModel,其持有Application引用。

实现原理

主要在lifecycle-extensionslifecycle-viewmodel这两个包。

  • 一个Activity/Fragment可以关联多个ViewModel,其通过ViewModelStore进行关联,在最新支持包中Activity持有一个ViewModelStore成员变量,而Fragment是通过外面Activity关联的FragmentManagerViewModelmViewModelStores进行关联。ViewModelStore本质就是一个Map,key值是一个ViewModel的唯一标示,当前源码实现是androidx.lifecycle.ViewModelProvider.DefaultKey:{canonicalName},value值是ViewModel对象。通常使用ViewModelProviders工具类拿到关联的ViewModel

  • 通过Lifecycle监听ON_DESTROY事件,执行ViewModelonClear()函数,实现生命周期感知。

  • 针对屏幕旋转等情况,通过onRetainNonConfigurationInstance()/getLastNonConfigurationInstance()函数避免ViewModelStore重新构建

讨论

  1. 通过ViewModel实现Fragment间交互:只要不同Fragment外层的Activity是同一个,就可以用外层Activity的ViewModel实现交互

  2. 保存UI状态三张方式对比

官方提供androidx.lifecycle:lifecycle-viewmodel-savedstate包,可以给ViewModel提供SavedStateHandle对象,方便在ViewModel中进行onSaveInstanceState()操作。SavedStateHandle对象持有Map,在最外层Activity/Fragment生命周期onSaveInstanceState()中把Map保存到Bundle中,onCreate()时取出,所以Map的key是String,value是Bundle支持的类型

参考

1.https://developer.android.com/topic/libraries/architecture/viewmodel
2.https://developer.android.com/topic/libraries/architecture/saving-states
3.https://developer.android.com/topic/libraries/architecture/viewmodel-savedstate
4.源码