0
点赞
收藏
分享

微信扫一扫

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

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

举报

相关推荐

0 条评论