首页 ViewModel的原理解析

ViewModel的原理解析

举报
开通vip

ViewModel的原理解析     ViewModel的原理解析          1.ViewModelViewModel作为AndroidJetPack里面的重要的一员,确实担任了一个十分重要的角色。也是实现MVVM架构的基础。所以会用并不能代表什么,而稍微把原理理清楚,你可以获得更多的知识(面试八股文)2.功能1.不会因为屏幕旋转等Actiity配置而导致销毁.2.跟随生命周期这里就不说明APi的使用了,网上文章太多了…3.不会因为屏幕旋转等Actiity配置而导致销毁这里只分析AndroidX我们来看一下他为什么可以跟随生命周期把....

ViewModel的原理解析
     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{privatefinalHashMapmMap=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();}}}});}又水了一篇,真开心~ -全文完-
本文档为【ViewModel的原理解析】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
资教之佳
暂无简介~
格式:doc
大小:197KB
软件:Word
页数:11
分类:互联网
上传时间:2023-06-24
浏览量:1