gpt4 book ai didi

android - 如何在 SAM 中调用挂起函数?

转载 作者:行者123 更新时间:2023-12-04 23:51:05 29 4
gpt4 key购买 nike

我正在尝试创建一个 Flow需要从回调中发出值但我不能调用 emit功能,因为 SAM 是正常功能

这是来自库的带有 SAM 的类,我无法真正按照我需要的方式对其进行修改。

class ValueClass {

fun registerListener(listener: Listener) {
...
}

interface Listener {
fun onNewValue(): String
}
}

这是我对创建 Flow 的看法目的
class MyClass(private val valueClass: ValueClass) {
fun listenToValue = flow<String> {
valueClass.registerListener { value ->
emit(value) // Suspension functions can only be called on coroutine body
}
}
}

我想如果我可以更改 ValueClass 会很简单但在这种情况下,我不能。我一直在思考这个问题并试图寻找实现。

至少据我目前所知,一种解决方案是使用 GlobalScope像这样
class MyClass(private val valueClass: ValueClass) {
fun listenToValue = flow<String> {
valueClass.registerListener { value ->
GlobalScope.launch {
emit(value)
}
}
}
}

现在,这可行,但我不想使用 GlobalScope因为我将使用 viewModelScope将其与我的应用程序的生命周期联系起来。

有没有办法解决这个问题?

提前致谢。任何帮助将不胜感激!

最佳答案

您可以使用 callbackFlow 创建 Flow从回调。它看起来像:

fun listenToValue(): Flow<String> = callbackFlow {
valueClass.registerListener { value ->
trySend(value)
channel.close() // close channel if no more values are expected
}
awaitClose { /*unregister listener*/ }
}
或者,如果回调中只需要一个值,您可以使用 suspendCoroutine suspendCancellableCoroutine .这个案例 listenToValue()函数必须是 suspend然后从协程调用(例如 someScope.launch ):
suspend fun listenToValue(): String = suspendCoroutine { continuation ->
valueClass.registerListener { value ->
continuation.resumeWith(value)
}
}

关于android - 如何在 SAM 中调用挂起函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58262746/

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