gpt4 book ai didi

android - 在 Kotlin 协程中等待 LiveData 结果

转载 作者:行者123 更新时间:2023-12-02 13:07:29 25 4
gpt4 key购买 nike

我有一个带有异步方法的存储库类返回 User包装成 LiveData :

interface Repository {
fun getUser(): LiveData<User>
}

在 ViewModel 的协程范围内,我想等待 getUser() 的结果方法并使用 User实例。

这就是我正在寻找的:
private fun process() = viewModelScope.launch {
val user = repository.getUser().await()
// do something with a user instance
}

我找不到 LiveData<>.await()扩展方法,以及任何实现它的尝试。
所以在我自己做之前,我想知道也许有更好的方法?

我发现的所有解决方案都是关于制作 getUser()一个 suspend方法,但是如果我无法更改 Repository ?

最佳答案

您应该能够创建 await()使用 suspendCancellableCoroutine() 的扩展功能.这可能不完全正确,但沿着这些思路应该可以工作:

public suspend fun <T> LiveData<T>.await(): T {
return withContext(Dispatchers.Main.immediate) {
suspendCancellableCoroutine { continuation ->
val observer = object : Observer<T> {
override fun onChanged(value: T) {
removeObserver(this)
continuation.resume(value)
}
}

observeForever(observer)

continuation.invokeOnCancellation {
removeObserver(observer)
}
}
}
}
这应该返回 LiveData 发出的第一个值,而不会留下观察者。

关于android - 在 Kotlin 协程中等待 LiveData 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62474359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com