用例
使用ReceiveChannel<T>中的T项的安卓片段。使用后,应从ReceiveChannel<T>中删除T%s。
我需要一个支持从其中消费项目的ReceiveChannel<T>。它应该起FIFO队列的作用。
我现在从我的UI附加到频道,如下所示:
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)非常适合我的用例,除了它在取消订阅时关闭频道。我希望通道保持畅通。这个是可能的吗?
发布于 2018-06-09 05:36:51
您可以使用BroadcastChannel。但是,您需要指定一个有限的大小(例如1),因为BroadcastChannel不支持UNLIMITED和0 (用于rendez-vous)。
您也可以像LiveData一样使用ConflatedBroadcastChannel,它总是将其拥有的最新值提供给新订阅者。
顺便说一句,如果你的新Fragment实例只收到最新的值,这有什么大不了的吗?如果不是,那么就使用ConflatedBroadcastChannel。否则,没有一个BroacastChannel适合您的用例(试一试,看看您是否得到了您想要的行为)。
https://stackoverflow.com/questions/50768585
复制相似问题