ViewModel
视图与数据模型之间的桥梁。
重要方法
onCleared() //用来释放资源。当ViewModel不再被需要,即与之相关的Activity都被销毁时,该方法会被系统调用。
实例化
ViewModel 一般和页面对应,具体取决于我们构建参数。
通过如下方法构建
ViewModelProvider(owner, factory).get(modelClass)
根据ViewModelStoreOwner 像activity,fragment都可以获取到(注意不同)。如果使用同一个ViewModel需要相同的 owner.
利用此,可以实现Fragment之间或与Activity的交互。
不要在ViewModel中,持有Context对象,可能会引起内存泄漏。如果需要可使用Application作为Context。
参考资料
Livedata
LiveData 是一个可被观察的数据持有类。与普通的被观察者(如 RxJava 中的 Observable)不同的是,LiveData 是生命周期感知的,也就是说,它能感知其它应用组件(Activity,Fragment,Service)的生命周期。这种感知能力可以确保只有处于 active 状态的组件才能收到 LiveData 的更新。
LiveData 是一个抽象类,我们不能直接使用。我们可以使用它的子类:MutableLiveData MediatorLiveData
MutableLiveData 是 LiveData 的一个最简单实现,它可以接收数据更新并通知观察者.
重要方法:
postValue(T value)//在子线程调用setValue(T value)//需要确保执行在主线程observe(LifecycleOwner owner, Observer<? super T> observer)//监听数据的变化
LifecycleOwner对应activity,fragment等,这也是Livedata感知生命周期的关键。
class MutableLiveDataFragment : Fragment() {
//监听回调
private val changeObserver = Observer<String> { value ->
value?.let { txt_fragment.text = it }
}
override fun onAttach(context: Context?) {
super.onAttach(context)
liveDataA.observe(this, changeObserver)
}
// .. some other Fragment specific code ..
}
MediatorLiveData 可以将多个LiveData源数据集合起来。监听多个LiveData的数据变化。
class MediatorLiveDataFragment : Fragment() {
private val changeObserver = Observer<String> { value ->
value?.let {
txt_fragment.text = it
}
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_mediator_live_data, container, false)
}
override fun onAttach(context: Context?) {
super.onAttach(context)
val mediatorLiveData = MediatorLiveData<String>()
mediatorLiveData.addSource((activity as MediatorLiveDataActivity).liveDataA) { mediatorLiveData.value = "A:$it" }
mediatorLiveData.addSource((activity as MediatorLiveDataActivity).liveDataB) { mediatorLiveData.value = "B:$it" }
mediatorLiveData.observe(this, changeObserver)
}
}
另外,还有 Transformations#map() 可以变换,LiveDataA -> LiveDataB.
Transformations#switchMap 可以切换 LiveData的监听。
参考资料:
LiveData使用详解
LiveData Demo地址