Kotlin 监听器内部监听器
我正在尝试为听众创建Kotlin 监听器内部监听器,kotlin,coroutine,kotlinx.coroutines,Kotlin,Coroutine,Kotlinx.coroutines,我正在尝试为听众创建制作人。 我的代码如下所示 suspend fun foo() = produce{ someEvent.addListener { this.send(it) } } 但是我发现,只有在协同程序中才能调用error暂停函数,这是有意义的。我的问题是。有没有一种方法可以使用协同程序实现此模式?有几种方法可以实现它,具体取决于您试图实现的目标: 如果您只想接收最近的事件,那么您应该使用一个合并的频道和offer方法,该方法始终成功: fun f
制作人。
我的代码如下所示
suspend fun foo() = produce{
someEvent.addListener {
this.send(it)
}
}
但是我发现,只有在协同程序中才能调用error暂停函数,这是有意义的。我的问题是。有没有一种方法可以使用协同程序实现此模式?有几种方法可以实现它,具体取决于您试图实现的目标:
如果您只想接收最近的事件,那么您应该使用一个合并的频道和offer
方法,该方法始终成功:
fun foo() = produce<T>(capacity = Channel.CONFLATED) {
someEvent.addListener {
offer(it)
}
}
如果您的生产者支持明确的背压信号(如功能性反应流),那么您应该使用一个特殊的适配器将其背压信号正确地传输到/从协程传输。kotlinx.coroutines
库中有许多现成的集成模块,其中包含用于此目的的各种反应式库。看
注意:您不应使用suspend
修饰符标记foo
函数。调用foo
无论如何都不会挂起调用程序。它只是立即(同步)启动一个生产者协同程序
要了解更多关于协同程序和各种频道的信息,我强烈建议您学习。感谢您提供了详尽的答案:)第一个解决方案:在我调用侦听器时,频道已经关闭,我没有关闭它。“频道已关闭”。你能帮我理解为什么吗?我为此提出了一个问题:
fun foo() = produce<T>() {
someEvent.addListener {
runBlocking { send(it) }
}
}
fun foo() = produce<T>(capacity = Channel.UNLIMITED) {
someEvent.addListener {
offer(it)
}
}