目录
- ViewModel是什么、为什么使用以及它的作用
- ViewModel如何使用
- AndroidViewModel
一、ViewModel是什么、为什么使用以及它的作用
是一种为了处理由于界面销毁数据进行保存恢复的技术。 ViewMode主要用来管理和存储与UI绑定的数据,同时ViewMode还与UI的生命周期相关联 。
自ViewModel发布,Google官方建议将应用所有的UI数据保存在ViewModel中,而不是Activity中。那么使用ViewModel来管理UI数据有哪些好处呢?
- 他有一个特点,就是即使activity因为旋转等原因执行了生命周期,viewmodel保存的数据也不会丢失。也不会直接销毁。
- 常规的做法是通过onSavaInstanceState()和onRestoreInstanceState()实现,但这种方式仅适合保存少量可以被序列化、反序列化的数据。
- viewModel一般配合MVVM框架进行使用,可以很好的进行依赖职责分离,activity只需要依赖vm层,而vm层不需要依赖activity层,比如数据传递,状态通知,已经再activity就可以全部做到,不需要vm层有需要依赖activity的接口来回调。有兴趣,可以看看MVP和MVVM的区别。
ViewModel之所以能在Activity重建时保存并恢复数据,因为Activity初次创建时会初始化创建VIewModel,在Activity销毁时,ViewModel对象不会销毁,在新的Activity重新创建后,仍然会执行之前的获取ViewModel的过程,Android系统采取了处理机制,使现在拿到的ViewModel就是前一次创建的对象.
我们可以通过一张图来理解一下viewModel的生命周期
二、ViewModel如何使用
- 添加依赖
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.0-alpha02'
- 继承ViewModel
class MyViewModel :ViewModel(){
var number:Int = 0
override fun onCleared() {
super.onCleared()
}
}
- 实例化ViewModel
class TestService1Activity : AppCompatActivity() {
lateinit var mbinding: ActivityTestService1Binding
val myViewModel:MyViewModel by viewModels()
private val TAG = "TestServiceActivity"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mbinding =ActivityTestService1Binding.inflate(layoutInflater)
setContentView(mbinding.root)
mbinding.tvtv1.text = myViewModel.number.toString()
}
override fun onStart() {
super.onStart()
Log.d(TAG, "onStart: ${TAG}")
mbinding.btbt1.setOnClickListener {
myViewModel.number++//可以看到数据没有被初始化。
mbinding.tvtv1.text = myViewModel.number.toString()
}
}
override fun onDestroy() {
super.onDestroy()
Log.d(TAG, "onDestroy: ${TAG}")
}
}
不会因为屏幕旋转而清零.
三、AndroidViewModel
AndroidViewModel是ViewModel的一个子类,可以直接调用getApplication(),由此可以访问应用的全局资源。
比如在一些情况下,你需要使用到context,那么如果你继承ViewModel,那么会没有,所以有了AndroidViewMode。除了这一点,其他用法和ViewModel一样,这里就不一一介绍,只需要继承AndroidViewModel。
四、最后
ViewModel的并不仅仅是为了管理UI数据,能够有效的划分职责,ViewModel提供了一个View(视图)和Model(数据模型)之间的桥梁,MVVM架构常用,使得视图和数据能够分离开,也能够保持通信。(结合LiveData)