【发布时间】:2018-06-08 21:26:01
【问题描述】:
用例
使用来自ReceiveChannel<T> 的T 项的Android 片段。消费后,Ts 应从 ReceiveChannel<T> 中删除。
我需要一个ReceiveChannel<T> 来支持从中消费物品。它应该起到 FIFO 队列的作用。
我目前从我的用户界面附加到频道,例如:
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`
不幸的是,当我从频道分离时,频道已关闭。这会导致.send(4) 和.send(5) 抛出异常,因为通道已关闭。我希望能够从频道中分离并让它保持可用。我该怎么做?
Channel<Int>(UNLIMITED) 非常适合我的用例,except 在取消订阅时关闭频道。我希望频道保持开放。这可能吗?
【问题讨论】: