首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >易用渠道

易用渠道
EN

Stack Overflow用户
提问于 2018-06-09 05:26:01
回答 1查看 810关注 0票数 1

用例

使用ReceiveChannel<T>中的T项的安卓片段。使用后,应从ReceiveChannel<T>中删除T%s。

我需要一个支持从其中消费项目的ReceiveChannel<T>。它应该起FIFO队列的作用。

我现在从我的UI附加到频道,如下所示:

代码语言:javascript
复制
launch(uiJob) { channel.consumeEach{ /** ... */ } }

我通过调用uiJob.cancel()来分离。

所需的行为:

代码语言:javascript
复制
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)非常适合我的用例,除了它在取消订阅时关闭频道。我希望通道保持畅通。这个是可能的吗?

EN

回答 1

Stack Overflow用户

发布于 2018-06-09 05:36:51

您可以使用BroadcastChannel。但是,您需要指定一个有限的大小(例如1),因为BroadcastChannel不支持UNLIMITED0 (用于rendez-vous)。

您也可以像LiveData一样使用ConflatedBroadcastChannel,它总是将其拥有的最新值提供给新订阅者。

顺便说一句,如果你的新Fragment实例只收到最新的值,这有什么大不了的吗?如果不是,那么就使用ConflatedBroadcastChannel。否则,没有一个BroacastChannel适合您的用例(试一试,看看您是否得到了您想要的行为)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50768585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档