官方申明
以下是ViewModel的官方文档:
https://developer.android.google.cn/topic/libraries/architecture/viewmodel.html#loaders
TheViewModelclass is designed to store and manage UI-related data in a lifecycle conscious way. TheViewModelclass allows data to survive configuration changes such as screen rotations.
ViewModel的作用就是保存数据,是为了更加细化功能分工,减轻Activity复杂度,让Activity只负责显示和处理用户操作。虽然ViewModel的诞生并非创新,但是在android中还是带来了很多方便之处,下面就来讲讲它的用武之地。(本文是对Google 官方文档的补充说明和具体实践)
1 解决Activity因屏幕旋转而丢失临时变量的数据
ViewModel可以做到保存页面的数据,并在屏幕旋转后重新恢复数据。就这一点,onSaveInstanceState和onRestoreInstanceState配合也能做到,但是对于大量数据恢复,ViewModel显得更专业,更简洁。
想像用户填写一张表单时,不小心旋转了屏幕,如果不做数据恢复的话用户会奔溃,如果用onSaveInstanceState,一个个恢复存储,开发者会奔溃,现在ViewModel出现了,方便的解决了一个两难的问题。具体实现如下:
1 继承ViewModel,实现一个可变化的数据容器,这里默认添加10个数据,保存在MutableLiveData中。
自定义ViewModel
2 在Activity中更新注册监听,并获取数据。这里使用ViewModelProviders.of(this)来关联当前activity生命周期,只有当activity彻底销毁后才会调用onCleared()方法清除ViewModel。model.getUsers().observe()监听activity生命周期变化,当activity onCreate()或onResume()时,注册的观察者会受到消息,从而更新ui。如果model中一开始有数据,也会受到消息从而更新ui。
Activity中ViewModel代码
activity和ViewModel生命周期关系图
2 使用ViewModel让多个Fragment共享数据
从前一个activity中有多个fragment,它们之间的通信,比如传递数据和状态之间的处理繁琐,容易出错。有了ViewModel之后,可以把共有的数据保存在ViewModel,是ViewModel在activity scope中处理数据通信,而不用管fragment的状态。
fragment共享数据
小结
ViewModel如果配合lifecycle的其他组件就可以发挥更多的作用,实现低耦合高内聚