源码笔录
androidx.lifecycle.ViewModelProvider源码:
- 包括两个能力:
- 缓存ViewModel方式:Key-Value。以
ViewModelStore类描述。 - 约定了ViewModel的创建方式:工厂模式。定义主要接口
Factory,描述创建ViewModel的行为。
- 缓存ViewModel方式:Key-Value。以
- 提供
Factory实现:- 抽象类
KeyedFactory:描述了一种以Key获取ViewModel实例的创建方式。 - 简单实现
NewInstanceFactory:利用反射,调用空构造器创建ViewModel实例。 AndroidViewModelFactory继承了NewInstanceFactory:对应创建AndroidViewModel子类的实例,满足那些需要持有Context实例的ViewModel,能快速实现。它是一个“单例模式”。也是通过反射调用带Application参数的构造器方法创建ViewModel实例, 若果失败,则调用默认构造器创建。
- 抽象类
androidx.lifecycle.ViewModelProviders源码:
封装了ViewModelProvider提供静态方法,针对Activity、Fragment创建一般性场景的ViewModelProvider实例。
- 静态方法
of():因为androix的Activity/Fragment类,都实现了ViewModelStoreOwner接口,持有一个ViewModelStore实例,所以of方法实际是为了接收一个ViewModelStore实例。然后,使用AndroidViewModelFactory单例,创建
读后思考结论:
-
一般性用法
ViewModelProviders.of(xx).get(xx),会创建一个ViewModelProvider实例。如果一个UI控件内有需要多个ViewModel实例,需要先缓存``ViewModelProviders.of(xx)实例,再调用get()`方法,不然会创建多个ViewModelProvider实例。万幸的是,of(xx)的是同一个UI控件实例,表示使用的是同一个ViewModelStore实例。 -
在具体的项目中,可以定义全局单例ViewModelProvider,用于缓存通用的ViewModel实例,而这个ViewModel实例,应该存放例如用户信息等全局状态的数据。
-
对于“ViewModel缓存”,貌似既可以利用ViewModelStore,又可以扩展
KeyedFactory来做,关键点则转换为Key-value数据结构的摆放位置。