ViewModel的原理解析 1.ViewModelViewModel作为AndroidJetPack里面的重要的一员,确实担任了一个十分重要的角色。也是实现MVVM架构的基础。所以会用并不能代
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
什么,而稍微把原理理清楚,你可以获得更多的知识(面试八股文)2.功能1.不会因为屏幕旋转等Actiity配置而导致销毁.2.跟随生命周期这里就不说明APi的使用了,网上文章太多了…3.不会因为屏幕旋转等Actiity配置而导致销毁这里只分析AndroidX我们来看一下他为什么可以跟随生命周期把.我们入口使我们的实例化过程viewModel=ViewModelProvider(this).get(DemoViewModel::class.java)在ViewModelProvider.java中可以看到它就是用的构造函数,而构造函数使用了getViewModel()函数publicViewModelProvider(@NonNullViewModelStoreOwnerowner){this(owner.getViewModelStore(),ownerinstanceofHasDefaultViewModelProviderFactory?((HasDefaultViewModelProviderFactory)owner).getDefaultViewModelProviderFactory():NewInstanceFactory.getInstance());}publicViewModelProvider(@NonNullViewModelStoreOwnerowner,@NonNullFactoryfactory){this(owner.getViewModelStore(),factory);}从getViewModel进入,会发现是一个接口,那它的实现类是在哪呢?跟踪后发现是在CompontActivity.java中可以发现,mViewModelStore就在这进来的,若为空则从一个叫做NonConfigurationInstances中获取,若里面没有东西则新建一个ViewModelStore.publicViewModelStoregetViewModelStore(){//...if(mViewModelStore==null){NonConfigurationInstancesnc=(NonConfigurationInstances)getLastNonConfigurationInstance();if(nc!=null){//RestoretheViewModelStorefromNonConfigurationInstancesmViewModelStore=nc.viewModelStore;}if(mViewModelStore==null){mViewModelStore=newViewModelStore();}}returnmViewModelStore;}这里产生两个问题:ViewStore是干嘛的?NonConfigurationInstances又是干嘛的?进入ViewStore类我们可以看到,它是存放ViewModel的一个存储类,里面用hashmap保存ViewModel.这里留下这个clear()函数的伏笔publicclassViewModelStore{privatefinalHashMap
mMap=newHashMap<>();finalViewModelget(Stringkey){returnmMap.get(key);}publicfinalvoidclear(){for(ViewModelvm:mMap.values()){vm.clear();}mMap.clear();}}NonConfigurationInstances的获取是由getLastNonConfigurationInstance()函数得到进入该函数你会不知道写了什么东西.但是翻看官方文档得知,这个实例由onRetainNonConfigurationInstance()返回publicObjectgetLastNonConfigurationInstance(){returnmLastNonConfigurationInstances!=null?mLastNonConfigurationInstances.activity:null;}还是在ComponentActivity.java中找到该函数。可以清楚的看到,nci偷偷的保存了viewModelStore.并且返回了该实例,这里返回的NonConfigurationInstances()类,就是getLast…返回的实例publicfinalObjectonRetainNonConfigurationInstance(){//Maintainbackwardcompatibility.Objectcustom=onRetainCustomNonConfigurationInstance();ViewModelStoreviewModelStore=mViewModelStore;if(viewModelStore==null){//NoonecalledgetViewModelStore(),soseeiftherewasanexisting//ViewModelStorefromourlastNonConfigurationInstanceNonConfigurationInstancesnc=(NonConfigurationInstances)getLastNonConfigurationInstance();if(nc!=null){viewModelStore=nc.viewModelStore;}}if(viewModelStore==null&&custom==null){returnnull;}NonConfigurationInstancesnci=newNonConfigurationInstances();nci.custom=custom;nci.viewModelStore=viewModelStore;returnnci;}所以我们也找到了保存的地方,在返回的地方我们也找到了~所以这就是在Activity配置转换的时候,viewModel不会被销毁的原因了.4.跟随生命周期来,官方文档经典生命周期.可以看到,Viewmodel实在OnDestory后才onCleared的.那么我们的onCleared在那里调用以及如何保证的呢?.还记得我们上面留下的伏笔吗?进入到该oncleared()函数,看他在哪里调用的.仍然是ComponentActivity.java中可以看到它直接用的是Lifecycle中的观察方式了.So,Lifecycle也是JatPack的一员,它直接应用到这里了。如果有不明白的可以先去了解一下Lifecycle.publicComponentActivity(){Lifecyclelifecycle=getLifecycle();getLifecycle().addObserver(newLifecycleEventObserver(){@OverridepublicvoidonStateChanged(@NonNullLifecycleOwnersource,@NonNullLifecycle.Eventevent){if(event==Lifecycle.Event.ON_DESTROY){//ClearouttheavailablecontextmContextAwareHelper.clearAvailableContext();//AndcleartheViewModelStoreif(!isChangingConfigurations()){getViewModelStore().clear();}}}});}又水了一篇,真开心~ -全文完-