自学内容网 自学内容网

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)!