我有以下功能。
suspend fun result() = suspendCancellableCoroutine<Int> {continuation ->
val callback = object : Callback {
continuation.resume(value)
}
}
然后我在协程中调用结果,如下所示:
someCoroutine {
when (result()){
x -> doSomething
y -> doSomething
...
}
}
它有效,但再次调用时我不断收到错误:
未捕获的异常:已恢复,但建议更新。
我想我需要一个callbackFlow,但我不太确定如何实现它。这是我到目前为止所拥有的。
suspend fun result() = callbackFlow<Int> {
val callback = object : Callback {
trySendBlocking(value)
}
awaitClose()
}
我猜我必须使用collect(),但我不知道如何在协程中处理它。任何帮助将不胜感激。
要使用
Flow
发出的值,您需要使用 终端运算符之一,例如 collect
:
coroutineScope.launch {
result().collect { value ->
when (value) {
x -> doSomething
y -> doSomething
...
}
}
}
错误
Uncaught exception: Already resumed, but proposed with update.
表示您多次调用resume
,检查您的回调是否被多次调用?
顺便说一句,通常你需要
continuation.invokeOnCancellation
在协程取消时正确释放资源(回调),请参阅文档了解suspendCancellableCoroutine
详细信息。