从常规 Java 函数向 kotlin 的流程发出数据



我有一个无法更改的外部接口:

interface ExternalApi {
fun onDataReceived(data: String)
}

我需要开始消耗数据并将其发送到flow。数据顺序是必要的。我想要一个冷flow,但我找不到具有emit功能的冷flow版本,所以我使用设置为最大值的热flow+重播作为解决方法。这是我的第一次尝试:

class FlowProblem {
val flow: MutableSharedFlow<String> = MutableSharedFlow(replay = Int.MAX_VALUE)
fun startConsuming() {
object : ExternalApi {
override fun onDataReceived(data: String) {
flow.emit(data)
}
}
}
}

不幸的是,它不能工作,因为emit函数是一个挂起的函数。然而,这是一个外部接口,我不能添加suspend修饰符。我也试着做这样的事情:

override fun onDataReceived(data: String) {
val coroutineScope = CoroutineScope(Job())
coroutineScope.launch {
flow.emit(data)
}
}

但对我来说,仅仅为了将数据移动到流中而创建新的协同程序有点傻。我还想知道数据顺序。

我该怎么办?也许这里的流程/渠道不合适,我应该另选一个?

感谢IR42,callbackFlow正是我所需要的。

最新更新