java - 如何使用 LiveData 实现 zip 功能

标签 java android

我正在使用两个 LiveDatas 从我的服务器获取数据,并希望在两个 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
}

我期望 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
}



现在,您可以调用zip(firstLiveData,secondLiveData)并观察它。

关于java - 如何使用 LiveData 实现 zip 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57237829/

相关文章:

java - mvn install 忽略 hibernate 映射文件

java - 拦截 Spring MVC 3 中的 View /响应

javascript - 如何使用 NativeScript 从 java.util.Set java 服务创建 JavaScript 数组到 Android 中

android - 如何设置绘制的位图宽度和高度

android - 如何验证 robotium 中的 View 或布局

android - 指定为非空的参数在 ArrayAdaper 中为空

java - Android、Gradle 产品 flavor ;包不存在

java - 更改属性文件而不重新部署 war

android - 使用加速度计计算旋转矩阵

java - 时间范围内任何事件的最大发生次数