gpt4 book ai didi

kotlin - 耗材 channel

转载 作者:行者123 更新时间:2023-12-02 13:23:15 31 4
gpt4 key购买 nike

用例
消耗 T 项的 Android 片段来自 ReceiveChannel<T> .一旦消耗,T s 应该从 ReceiveChannel<T> 中删除.
我需要一个 ReceiveChannel<T>支持从中消费元素。它应该用作 FIFO 队列。
我目前从我的用户界面附加到 channel ,例如:

launch(uiJob) { channel.consumeEach{ /** ... */ } }
我通过调用 uiJob.cancel() 进行分离.
期望的行为:
val channel = Channel<Int>(UNLIMITED)

channel.send(1)
channel.send(2)
// ui attaches, receives `1` and `2`
channel.send(3) // ui immediately receives `3`
// ui detaches
channel.send(4)
channel.send(5)
// ui attaches, receiving `4` and `5`
不幸的是,当我与 channel 分离时, channel 已关闭。这会导致 .send(4).send(5)因为 channel 关闭而引发异常。我希望能够从 channel 中分离并让它保持可用。我怎样才能做到这一点? Channel<Int>(UNLIMITED)非常适合我的用例,除了取消订阅时关闭 channel 。我希望 channel 保持开放。这可能吗?

最佳答案

Channel.consumeEach方法调用 Channel.consume在文档中有这一行的方法:

Makes sure that the given block consumes all elements from the given channel by always invoking cancel after the execution of the block.



所以解决办法是干脆不使用 consume[Each] .例如,您可以这样做:
launch(uiJob) { for (it in channel) { /** ... */ } }

关于kotlin - 耗材 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50768585/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com