ViewModel解析

1. 使用

MyViewModel

2. 作用

i. 保存Activity/Fragment中的数据
ii. 生命周期作用于Activity/Fragment之外,在使用时创建,在Activity/Fragment销毁时自动清空数据
iii. 在翻转屏幕时数据不丢失
iv. 协程Scope
v. 生命周期


ViewModel生命周期

3. 原理

ViewModel时序图
  • 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
    进行处理。

ViewModel 使用及原理解析

你可能感兴趣的:(ViewModel解析)