ViewModel 的创建

  • 关键:ViewModelStoreOwnerViewModelStoreViewModelProvider(.Factory)

ViewModelStoreOwner

  • 是一个接口,ComponentActivity(AppCompatActivity的基类) 和 Fragment 实现
  • interface ViewModelStoreOwner {
        val viewModelStore: ViewModelStore
    }
  • 实现类提供一个 ViewModelStore 实例

ViewModelStore

  • 是一个持有 ViewModel 实例的容器类。内部可以理解为一个 HashMap<String, ViewModel>。它的关键特性是:ViewModelStore 实例的生命周期比实现 ViewModelStoreOwner 的 Activity/Fragment 实例更长,它能够跨越配置更改而存活下来。
  • open class ViewModelStore {
     
        private val map = mutableMapOf*<String, ViewModel>()
     
        // 。。。
        fun clear() {
            for (vm in map.values) {
                vm.clear()
            }
            map.clear()
        }
    }

ViewModelProvider

  • 这是获取 ViewModel 实例的入口类。它需要一个 ViewModelStoreOwner (或者直接一个 ViewModelStore) 和一个可选的 ViewModelProvider.Factory 来工作。

ViewModelProvider.Factory

  • 这是一个接口,负责实际创建 ViewModel 的新实例。如果你的 ViewModel 有非空的构造函数(例如需要传入 Repository 或其他依赖),你就需要提供自定义的 Factory。

ViewModel 创建流程

  • MyViewModel viewModel = new ViewModelProvider(this).get(MyViewModel.class);
  • 因为给 ViewModelProvider 传入了一个 ViewModelStoreOwner,ViewModelProvider 就会调用 ViewModelStoreOwner 的 getViewModelStore 方法获取到 ViewModelStore 实例
  • 如果是新的实例,ViewModelProvider 会调用持有的 Factory 创建一个新的 MyViewModel 并放入 ViewModelStore 中

为什么 ViewModel 的生命周期能独立于 Activity 之外 ? (字节剪映一面)

  • ViewModel 实例在首次调用时被创建,并且存储在 Activity 的 ViewModelStore 成员中
  • Activity 被销毁前,ViewModelStore成员在 OnRetainNonConfiguration() 回调中保存(这是 Android 框架实现的)
  • Activity 重新创建后,会先调用 getLastNonConfiguration() 是否为空且找到保存的 ViewModelStore,复用之前创建好的 ViewModel 实例