我有一个无法更改的外部接口:
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
正是我所需要的。