如何使用LiveData实现zip功能

mar*_*ess 3 java android

我正在使用两个 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 的两个值

Sae*_*umi 6

你需要的是所谓的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)并观察。