MVVM框架的好处就不做任何阐述,只是总结一下常见的知识点。
Android的DataBinding在已经内置了,因此只需要在app模块的build.gradle中开启就可以使用了。DataBinding,顾名思义就是数据绑定,可以看到现在的三个组件都与数据有关系,ViewModel数据持有,LiveData数据观察、DataBinding数据绑定。
ViewModel只会在Activity存活,且只会创建一次。当销毁时,会主动调用onClered。
在Activity里面创建
var viewModel = ViewModelProvider(this).get(MyViewModel::class.java);//使用ViewModelProvider函数创建一个实例
为什么整个生命周期方式很重要?例如:app需要频繁异步请求数据,比如请求网络调接口,这些都是相当耗时。比如Activity被销毁后接口请求才返回,考虑到内存泄漏情况,会给我们增添好多复杂工作。但现在我们利用ViewModel处理数据回调,可以解决此问题。意思只要继承我们的ViewModel后,可能会出现的bug,google都帮我们处理了。
因为在Activity存活时,只创建一次,那么在此Activity下的所有Fragment,diaog等都可以共享一个ViewModel
由于 ViewModel 生命周期可能长与 activity 生命周期,所以为了避免内存泄漏Google禁止在ViewModel中持有Context或activity或view的引用。如果非得使用Context,
可以继承AndroidViewModel 类中获取ApplicationContext
之前我们在activity销毁重建时,可以用activity的onSaveInstanceState()机制保存和恢复数据,但缺点明显,
只适合保存少量的可以被序列化、反序列化的数据。假如我们需要保存一个比较大的数据,这个时候ViewModel就可以实现。
LiveData 是一个有生命周期感知 & 可观察的数据持有者类
作用:
持久化的观察数据的更改与变化
特点:
1、感知对应Activity的生命周期,只有生命周期处于onStart与onResume时,LiveData处于活动状态,才会把更新的数据通知至对应的Activity
2、当生命周期处于onStop或者onPause时,不回调数据更新,直至生命周期为onResume时,立即回调
3、当生命周期处于onDestory时,观察者会自动删除,防止内存溢出
4、共享资源。可以使用单例模式扩展LiveData对象以包装系统服务,以便可以在应用程序中共享它们,同时有遵守了以上生命周期
LiveData有2个方法通知数据改变:
同步:.setValue(value)接收端数据回调与发送端同一个线程,此方法只能在主线程里调用
异步:.postValue(value)接收端在主线程回调数据,此方法可以在其他线程中调用(常用)
MutableLiveData(常用):SigleLiveData:LiveData:ObservableField
MutableLiveData是一个比较尽职的人,有几个人在等待他都会尽职的通知到。而SigleLiveData就不同了,他只会通知给他第一个遇见的人,剩余的人就没法收到了。LiveData的postValue和setValue方法是protected,而MutableLiveData这两个方法则是public,也就是说Livedata只允许调用observe方法被动监听数据变化,而MutableLiveData除了监听变化外,还可以用postValue和setValue方法发射数据
ObservableField一般是和布局文件xml的变量进行绑定的,调用其set方法后更新数据,这时候绑定的UI也会随之变化:
LiveData配合ViewModel使用,不用监听也能绑定数据了
网友评论