1. 使用
2. 作用
i. 保存Activity/Fragment中的数据
ii. 生命周期作用于Activity/Fragment之外,在使用时创建,在Activity/Fragment销毁时自动清空数据
iii. 在翻转屏幕时数据不丢失
iv. 协程Scope
v. 生命周期
3. 原理
- ViewModelProvider是一个供外部操作的类。
- ViewModelStore内部其实是一个HashMap,用来存储ViewModel,key为 DEFAULT_KEY+ ”:“+getCanonicalName() 例如为 androidx.lifecycle.ViewModelProvider.DefaultKey : com.wuba.acm.leetcode.Solution,value即为ViewModel。
- 当没有ViewModel的时候,调用Factory去创建对象,注意:默认的Factory是只会创建没有构造函数的对象的,如果你的ViewModel有构造函数,需要自定义实现Factory。
- 在需要ViewModel的时候,FragmentActivity会创建ViewModelStroe,在Activity结束时,也会调用ViewModelStore的clear方法清空对象。
- 在翻转屏幕时其实并没有威胁到ViewModelStore的存在,我们知道屏幕翻转时的生命周期为onPause->onStop->onDestroy->onCreate->onStart->onResume,唯一能使ViewModelStore清空的只有onDestroy方法,但是在detroy里面其实是有特殊处理的,FragmentActivity会调用isChangingConfigurations()判断Activity是否是翻转还是finish,从而保证数据不被清理掉。
- 在FragmentActivity中也通过 NonConfigurationInstances 处理了界面异常关闭,注意:普通的ViewModel并不能处理onStavedInstance方法保存的数据,请参考SavedStateViewModel
进行处理。