Jetpack 之 ViewModel 原理

ViewModel 源码分析

入口

四种方式创建ViewModel,最终生成ViewModelStore进行存储

nameViewModel = new ViewModelProvider.NewInstanceFactory().create(NameViewModel.class);
nameViewModel = ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication()).create(NameViewModel.class);
nameViewModel = new ViewModelProvider(this).get(NameViewModel.class);
nameViewModel = ViewModelProviders.of(this).get(NameViewModel.class);

ViewModelProvider

分为两个分支,第一次和非第一次流程

第一次

ComponentActivity#getViewModelStore
---> (为空)Activity#getLastNonConfigurationInstance
---> Activity#NonConfigurationInstances(第一次为null)
---> new ViewModelStore()

非第一次

直接返回ViewModelStore

获取实例内容

get(NameViewModel.class)

分为两个分支,第一次和非第一次流程

第一次

get(NameViewModel.class)
---> 第一次ViewModel为空
---> ViewModelProvider#create
---> SavedStateViewModelFactory#create
---> create
---> 反射构造方法,ViewModelProvider->newInstance
---> 反射实例NameViewModel

ViewModelProvider#create 多个实现

SavedStateViewModelFactory#create
AbstractSavedStateViewModelFactory#create
NavControllerViewModel#create
ViewModelProvider#AndroidViewModelFactory#create
ViewModelProvider#NewInstanceFactory#create
NavControllerViewModel#create
LoaderManagerImpl#LoaderViewModel#create
FragmentManagerViewModel#create

非第一次

直接返回ViewModel<实例>

旋转屏幕配置等逻辑--onRetainCustomNonConfigurationInstance存储


(旋转屏幕)LocalActivityManager#dispatchRetainNonConfigurationInstance
---> ComponentActivity#onRetainNonConfigurationInstance
---> Activity
---> NonConfigurationInstances#activity(持有ViewModelStore)

ComponentActivity#NonConfigurationInstances,存custom和viewstore

清理ViewModelStore逻辑

CommponentActivity()构造方法 
---> getLifeCycle.addObserver 添加观察者
---> onDestroy 逻辑
        ---> 未改变转屏配置!isChangingConfigurations 情况下----> 清理ViewStore
       ---->isChangingConfigurations转屏--->不清理生么也不操作

追踪到AMS

前面已经追踪到调用方:

LocalActivityManager#dispatchRetainNonConfigurationInstance

继续向上追踪代码,会看到Binder

(Binder)LocakActivityRecord

onRetainNonConfigurationInstance

ViewModel.png

实际上,如果Activity不销毁的话,AMS存在ViewModel的副本作为缓存。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容