本文会基于最新版ViewModel使用方法与源码进行详细分析,从注册到实现ViewModel界面数据如何保存与管理全部涉及。
**
简介:
**ViewModel
是JetPack系列库之一,它用来对组件的界面数据进行管理,且当组件的状态发生改变时数据依然留存。
优点:1.当所依赖组件的状态发生改变时,例如屏幕旋转等,界面数据不会发生改变
2.实现MVVM架构的基础,在日常开发中,ViewModel
就是MVVM架构的VM层,它相当于MVP架构的present,我们可以将业务逻辑以及数据交互的部分放入ViewModel中。
源码分析:
版本:viewmodel:1.1.1
此处使用的示例代码与livedata源码分析的相同,不影响流程分析
首先构造一个继承于ViewModel
的类
接着创建一个factory
实例传入ViewModelProvider(this,factory )
中去并调用get
方法将我们的ViewModel
作为参数传入。
此处需要注意的是在以前的版本中直接通过 ViewModelProviders.of(this).get()
方法来完成这个操作的。在最新的版本中已经取消了of方法,并且构造方法必须要传入2个参数
查看ViewModelProvider
的构造方法可看出构造ViewModelProvider
时必须传入2个参数才行,其中第一个参数为ViewModelStore
,第二个参数为factory,
ViewModelStore
用来存储和管理ViewModel
,factory
则用来对ViewModel
进行实例化。此时构建ViewModelProvider
时传入的参数为所依赖的组件的ViewModelStore
,也就是说,我们通过组件的ViewModelStore
来对ViewModel
进行存储和管理。
其中factory
需要我们在构造的时候进行传入,ViewModelProvider
给我们提供了3种实例化的方法,分别是简单工厂模式构造,通过反射构造实例,以及我们自己实现factory构造实例。
当我们使用ViewModelProvider.NewInstanceFactory()
构造实例时,查看源码可看出,它实现了Factory
接口,并且在其内部的create
方法中会调用我们在之前get
方法中传入的viewmodel
的newInstance
方法。这个方法需我们自己在viewmodel
中去实现,用来返回viewmodel
实例,如果实例化出错则会抛出异常
public static class NewInstanceFactory implements Factory {
@SuppressWarnings("ClassNewInstance")
@NonNull
@Override
public <T extends ViewModel> T create(@NonN