ViewModelProvider源码阅读小记

2,164 阅读1分钟

源码笔录

androidx.lifecycle.ViewModelProvider源码:

  • 包括两个能力:
    • 缓存ViewModel方式:Key-Value。以ViewModelStore类描述。
    • 约定了ViewModel的创建方式:工厂模式。定义主要接口Factory,描述创建ViewModel的行为。
  • 提供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数据结构的摆放位置。