Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何观察2个MutableLiveData中的值何时返回?_Android_Android Livedata - Fatal编程技术网

Android 如何观察2个MutableLiveData中的值何时返回?

Android 如何观察2个MutableLiveData中的值何时返回?,android,android-livedata,Android,Android Livedata,我有两个可变的LiveData。只有当从两个MutableLiveData返回值时,我才需要执行任务。 对于2LiveData,我们可以使用MediatorLiveData执行同样的操作。在我的例子中,我使用的是MutableLiveData,它需要LiveData而不是MutableLiveData 现在,我如何仅在两个MutableLiveData的值都返回时执行任务?您仍然可以使用MediatorLiveData,因为MutableLiveData扩展自LiveData。请查看此链接以获取

我有两个可变的LiveData。只有当从两个MutableLiveData返回值时,我才需要执行任务。 对于2LiveData,我们可以使用MediatorLiveData执行同样的操作。在我的例子中,我使用的是MutableLiveData,它需要LiveData而不是MutableLiveData


现在,我如何仅在两个MutableLiveData的值都返回时执行任务?

您仍然可以使用
MediatorLiveData
,因为
MutableLiveData
扩展自
LiveData
。请查看此链接以获取Marek Kondracki的答案:

val profile=MutableLiveData()
val user=MutableLiveData()
val title=profile.combineWith(user){profile,user->
“${profile.job}${user.name}”
}
有趣的LiveData.combineWith(
liveData:liveData,
块:(T?,K?)->R
):LiveData{
val result=MediatorLiveData()
result.addSource(此){
result.value=block.invoke(this.value,liveData.value)
}
result.addSource(liveData){
result.value=block.invoke(this.value,liveData.value)
}
返回结果
}
val profile = MutableLiveData<ProfileData>()

val user = MutableLiveData<CurrentUser>()

val title = profile.combineWith(user) { profile, user ->
    "${profile.job} ${user.name}"
}

fun <T, K, R> LiveData<T>.combineWith(
    liveData: LiveData<K>,
    block: (T?, K?) -> R
): LiveData<R> {
    val result = MediatorLiveData<R>()
    result.addSource(this) {
        result.value = block.invoke(this.value, liveData.value)
    }
    result.addSource(liveData) {
        result.value = block.invoke(this.value, liveData.value)
    }
    return result
}