我正在使用两个 LiveData 从我的服务器获取数据,并希望在两个 LiveData 完成后得到结果?
LiveData live1 = ...;
LiveData live2 = ...;
MutableLiveData live3 = ...;
live1.observe(this, value -> {
live3.postValue(value);
});
live2.observe(this, value -> {
live3.postValue(value);
});
live3.observe(this, value -> {
// TODO: Get both values from live1, live2
}
Run Code Online (Sandbox Code Playgroud)
我期望 live1 和 live2 的两个值
你需要的是所谓的zip功能:
fun <A, B> zip(first: LiveData<A>, second: LiveData<B>): LiveData<Pair<A, B>> {
val mediatorLiveData = MediatorLiveData<Pair<A, B>>()
var isFirstEmitted = false
var isSecondEmitted = false
var firstValue: A? = null
var secondValue: B? = null
mediatorLiveData.addSource(first) {
isFirstEmitted = true
firstValue = it
if (isSecondEmitted) {
mediatorLiveData.value = Pair(firstValue!!, secondValue!!)
isFirstEmitted = false
isSecondEmitted = false
}
}
mediatorLiveData.addSource(second) {
isSecondEmitted = true
secondValue = it
if (isFirstEmitted) {
mediatorLiveData.value = Pair(firstValue!!, secondValue!!)
isFirstEmitted = false
isSecondEmitted = false
}
}
return mediatorLiveData
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以致电zip(firstLiveData,secondLiveData)并观察。
| 归档时间: |
|
| 查看次数: |
3383 次 |
| 最近记录: |