kotlin - 关闭后忽略协程 channel 的报价

标签 kotlin kotlinx.coroutines

是否有一种好方法可以让 channel 在关闭后忽略报价而不抛出异常?

目前,似乎只有 try catch 会起作用,因为 isClosedForSend 不是原子的。

或者,如果我根本不关闭 channel ,会有问题吗? 对于我的特定用例,我使用 channel 作为 Android 实时数据的替代方案(因为除了从任何线程发送值和从主线程监听之外,我不需要任何好处)。在那种情况下,我可以通过只在我想要时发送值的生产者收听 channel ,而忽略所有其他输入。

理想情况下,我有一个解决方案,其中 ReceiveChannel 仍然可以完成监听,但 SendChannel 在提供新值时永远不会崩溃。

最佳答案

channel 抛出这个异常by design , 作为正确沟通的方式。

如果你绝对必须有这样的东西,你可以使用这种扩展函数:

private suspend fun <E> Channel<E>.sendOrNothing(e: E) {
    try {
        this.send(e)
    }
    catch (closedException: ClosedSendChannelException) {
        println("It's fine")
    }
}

您可以使用以下代码对其进行测试:

val channel = Channel<Int>(capacity = 3)
    launch {

        try {
            for (i in 1..10) {
                channel.sendOrNothing(i)
                delay(50)
                if (i == 5) {
                    channel.close()
                }
            }

            println("Done")
        }
        catch (e: Exception) {
            e.printStackTrace()
        }
        finally {
            println("Finally")
        }
    }

    launch {
        for (c in channel) {
            println(c)
            delay(300)
        }
    }

您会注意到,由于 channel 已关闭,生产者将开始打印“It's fine”,但消费者仍将能够读取前 5 个值。

关于你的第二个问题:视情况而定。

Channels 没有这么大的开销,suspended coroutines 也没有。但是泄漏就是泄漏,你知道的。

关于kotlin - 关闭后忽略协程 channel 的报价,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54190478/

相关文章:

kotlin - java.lang.IllegalStateException :JSON OBJECT and JSON ARRAY when parsing Json using GSON

Kotlin 协程 GlobalScope.launch 与 runBlocking

kotlin - "job + UI"上下文和使用 "parent = job"之间有什么区别?

android - 如何在 Kotlin 中编写一系列 promise ?

kotlin - 如何在 Kotlin/Native 中构建 kotlinx.coroutines(测试版本 0.23.4-native-1)

android - 试图从类 androidx.room.CoroutinesRoom$Companion 访问类 kotlin.jvm.internal.DefaultConstructorMarker

android - Unresolved reference : Kotlin needs 2 builds after clean to pick up code when using kapt

android - 尝试从 Room 数据库实例中检索值时抛出 IllegalStateException

Android复选框删除框保留文本

kotlin - Unresolved reference : Callback