Android(47)ViewModel 解析
2022-08-09 本文已影响0人
perry_Fan
ViewModel:具备生命周期感知能力的数据存储组件
ViewModel保存的数据,在页面因配置变更导致页面销毁重建之后依然也是存在的。
其中配置变量可能有横竖屏切换、分辨率调整、权限变更、系统字体样式变更...呃,貌似这种配置变更在实际中出现也比较少吧,那ViewModel的作用也不是特别的大呀,但是!!!因为内存电量不足导致系统被回收这种场景是不是实际很容易出现,此时利用ViewModel也可以达到页面的数据再次被复用的呢,这样来说ViewModel的使用意义就极大了,当然此时需要使用SavedState能力才行,但是它与常规的ViewModel的实现原理又大不一样。
其实可以从androidx的包名就可以看出它们都深度依赖于lifecycle:

也可以看出实际ViewModel+Livedata是会搭配使用的。
特性:
页面配置【因为宿主屏幕旋转、分辨率更改、权限变更等导致的宿主的销毁】更改数据不丢失、生命周期感应、数据共享。
添加依赖:

ViewModel的数据存储、生命周期感知:

其中有一个onCleared()回调,代表宿主生命销毁了,也能说明对于ViewModel而言它只感知了宿主生命周期的销毁了,另外是搭配LiveData来使用的,这样咱们不用关系宿主销毁没释放的问题了。
ViewModel数据共享:
对于Fragment而言,它可以跟Activity进行数据共享,具体如下:



ViewModel的用法:
常规用法:
存储的数据,仅仅只是当页面因为配置变更导致的销毁再重建时可复用。复用的是ViewModel的实例对象整体。下面来看一下相关使用代码:


进阶用法:
存储的数据,无论是配置变更、还是因为内存不足、电影不足等系统原因导致页面被回收再重建。都可以复用,既使ViewModel不是同一个实例,它存储的数据也能做到复用。当然如果页面被正常关闭,这里的数据是会被正常清理释放的。它的使用需要先添加以下依赖:

屏幕旋转ViewModel怎么做到保存数据的?