JetPack03-ViewModel 保证界面数据稳定性
前提
Activity横竖屏切换后,Activity中的数据会丢失。
因为横竖屏切换后,Activity会销毁重建,生命周期会执行onPause->onStop->onDestroy->onCreate->onStart->onReusme。
简介
ViewModel能保证Activity中数据的稳定性,在Activity中使用ViewModel,在Activity重建后能获取到销毁前的ViewModel,从而保证ViewModel中数据的稳定性。
ViewModel的生命周期是从Activity启动到真正销毁,其中包含屏幕旋转引起的重建。
使用
创建ViewModel类,继承ViewModel抽象类
使用ViewModelProvider获取ViewModel类对象,屏幕旋转后,number数据不会丢失。
源码分析
ViewModel为什么能保证数据的稳定性?
在屏幕旋转时,Activity生命周期会从onPause->onStop->onDestroy->onCreate->onStart->onReusme,那么在Activity销毁重建后如何能获取到之前的ViewModel呢?
先来看下ViewModel对象是如何获取的?
为什么需要参数ViewModelStoreOwner,可以传入this?
this= MainActivity,MainActivity是ViewModelStoreOwner的子类。
ViewModelStoreOwner接口实现了什么功能?
ViewModelStore类的作用?
ViewModelProvider的初始化做了什么?
传入ViewModelStoreOwner的目的是为了获取ViewModelStore。
ViewModelStoreOwner的getViewModelStore()的实现是在ComponentActivity类中实现的,如何实现的?
屏幕旋转Activity重建后获取ViewModelStore的时候,会从NonConfigurationInstances中获取。(NonConfigurationInstances中的ViewModelStore在重建的时候不会丢失,具体见AMS管理Activity),因此能保证Activity重建后使用的仍是重建前的ViewModel,保证了ViewModel中的数据不变。
如何获取ViewModel对象?
ViewModel的生命周期?
ViewModel是在第一次获取对象的时候创建的,并存入Activity的ViewModelStore中。
在Activity销毁时,会将ViewModel从ViewModelStore中移除掉,避免内存泄漏。
VieModelStroe如何处理的移除ViewModel呢?
在ComponentActivity构造函数中添加了Lifecycle观察者,监听Activity生命周期,当监听到ON_DESTROY的时候,移除ViewModelStore中所有的ViewModel。
其中使用了isChangingConfigurations()判断,在屏幕旋转引起的ON_DESTROY的时候,不移除ViewModel。
Q&A
ViewModel为什么要用ViewModelProvider使用反射创建对象?
统一管理ViewModel,保证ViewModel数据的稳定性。
如果自行使用new ViewModel()创建,无法在Activity重建的时候保存ViewModel的数据,会随着Activity的onDestrory被销毁。
原文地址:https://blog.csdn.net/li1500742101/article/details/142566980
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!