LiveData 是一个可被观察的数据持有类,他是官方MVVM架构中的一个核心类,作为一个被观察者,不仅可以被订阅还具有生命周期的感知能力,只有在处理active状态下才会被收到更新。
LiveData是一个抽象类,所有我们在使用时都是用的它的子类,我们来看一下官方为我们提供了实现类MutableLiveData
和MediatorLiveData
MutableLiveData
MutableLiveData 是 LiveData 的一个最简单实现,它可以接收数据更新并通知观察者。
val liveDataA = MutableLiveData<String>()
liveDataA.value = someValue
liveDataA.postValue(value)
Transformations#map()
使用 Transformations#map() 方法可以将数据从一个 LiveData 传递到另一个 LiveData
val transformedLiveData = Transformations.map(liveDataA ) { "the a value is:$it" }
当liveDataA的值发生变化时,相对应的transformedLiveData 的值也会相应的得到更新
Transformations#switchMap
switchMap可以通过一个LiveData的值,在几个LiveData的数据之间切换
val liveDataA = MutableLiveData<Int>().also { it.value=1 };
val liveDataB = MutableLiveData<String>().also { it.value="bb" }
val liveDataC = MutableLiveData<String>().also { it.value="cc" }
val liveDataD = MutableLiveData<String>().also { it.value="dd" }
val liveData = Transformations.switchMap(liveDataA){
when(it){
1->liveDataB
2->liveDataC
else-> liveDataD
}
}
如上根据liveDataA的值,会在数据源的liveDataB,liveDataC,liveDataD中选择一个返回
MediatorLiveData
MediatorLiveData可以把多个LiveData集合起来
val liveDataB = MutableLiveData<String>().also { it.value="bb" }
val liveDataC = MutableLiveData<String>().also { it.value="cc" }
val mediatorLiveData = MediatorLiveData<String>()
mediatorLiveData.addSource(liveDataB){ it->
"it is $it"
}
mediatorLiveData.addSource(liveDataC){ it->
"it is $it"
}
如上,liveDataB 与 liveDataC中任意一个发生数据更新,都会使 mediatorLiveData 发生更新
本文参考LiveData的数据转换 Transformations使用
自定义LiveData可以参考Android livedata原理解析之自己实现一个简单的LiveData
网友评论