使用ViewModel存储Activity数据

ViewModel是用来存储UI相关的数据的,Activity在横竖屏变化的时候会被销毁,然后再重新创建,如果你把你的数据存储在Activity中,那么新建Activity的时候这些数据就没有了,用户就会很疑惑,屏幕旋转了下怎么界面的东西就没了?所以需要把界面相关的数据存储下来,下回接着用。使用ViewModel就可以做到这一点。

你可能会问,我的App只有竖屏是不是需要考虑这些了?

答案是否定的。这种Activity重新创建的情况有很多,只要发生了configuration changes,就会重建,横竖屏切换只是其中最典型的一种,其他还有十几种,比如字体变化和语言切换等,你总不可能每一种都不管吧,用户瞎操作出问题了咋办。

首先需要先添加依赖,在build.gradle加入:

然后需要介绍一下ViewModel抽象类,Activity的数据类都需要继承它。ViewModel类只有一个onCleared()方法,当这个ViewModel对象不再需要的时候,会调用这个方法,你可以做一些清理资源的操作。什么时候算是“不再需要呢”?当你按返回键,这个Activity销毁的时候,或者执行其他手动销毁Activity的时候。注意在横竖屏切换时,这个onCleared()是不会调用的,因为这个ViewModel还没结束使用。

MyData是我瞎写的一个演示类,类的成员你可以依具体需求而定。

在Activity获取MyData对象的时候,不是new一个,而是通过下面的代码来获取

通过ViewModelProvider.of()得到的ViewModelProvider将会和当前Activity的声明周期进行绑定。也就是说你通过ViewModelProvider.get()得到的ViewModel对象,也将会和Activity声明周期绑定。然后MyData就可以使用了,你可以将数据保存在MyData对象里,这个时候发生横竖屏切换,重建的Activity在onCreate中获取的MyData对象还是之前的。

虽然我们用Activity来举例,但是Fragment或其他LifecycleOwner实现都是适用的。ViewModel本身是不知道LifeCycle这些东西的。如果你的ViewModel需要用Context,那么记得不要试图去获取LifecycleOwner,因为LifecycleOwner是不知道Context是什么东西的。你可以将你的ViewModel类继承于AndroidViewModel类,后者有getApplication()方法提供ApplicationContext用。

发表评论

电子邮件地址不会被公开。