【发布时间】:2023-03-26 22:35:01
【问题描述】:
我正在尝试将 callbackFlow 包装在外部 flow 中 - 我想从外部流中发出一些项目,但我有一个旧的回调接口,我想适应 Kotlin 流程。我查看了几个examples of usage of callbackFlow,但我不知道如何在另一个流程中正确触发它。
这是一个例子:
class Processor {
fun start(processProgress: ProcessProgressListener) {
processProgress.onFinished() //finishes as soon as it starts!
}
}
interface ProcessProgressListener {
fun onFinished()
}
//main method here:
fun startProcess(processor: Processor): Flow<String> {
val mainFlow = flow {
emit("STARTED")
emit("IN_PROGRESS")
}
return merge(processProgressFlow(processor), mainFlow)
}
fun processProgressFlow(processor: Processor) = callbackFlow {
val listener = object : ProcessProgressListener {
override fun onFinished() {
trySend("FINISHED")
}
}
processor.start(listener)
}
Processor 带有一个侦听器,该侦听器在进程完成时触发。发生这种情况时,我想发出最后一个项目FINISHED。
我调用整个流程的方式如下:
runBlocking {
startProcess(Processor()).collect {
print(it)
}
}
但是,我没有得到任何输出。但是,如果我不使用megre 并且只返回mainFlow,我会得到STARTED 和IN_PROGRESS 项目。
我做错了什么?
【问题讨论】:
标签: kotlin kotlin-coroutines kotlin-flow