本文介绍: 对于那些还不支持的库,也可以将任何基于回调的 API 转换为协程。返回的是一个 ReceiveChannel,它的实现是收集上游发射的数据,然后发送到 Channel 中。这时候你可能有疑问了,这在流的内部不还是使用了基于接口的调用吗,分明没有更方便。在这个过程中,我们可以充分使用 Flow 的各种变换,对我们的中间过程进行处理。实现一些很难实现的需求。可以有多个消费者,但当向 Channel 中发射一个数据之后,收到该元素的消费者是不确定的。是一个数据流构建器,可以将基于回调的 API 转换为数据流。
一、 Flow 与 Channel 的相互转换
1.1 Flow 转换为 Channel
1.1.1 ChannelFlow
前面提到 ChannelFlow 是热流。只要上游产生数据,就会立即发射给下游收集者。
ChannelFlow 是一个抽象类,并且被标记为内部 Api,不应该在外部代码直接使用。
注意到它内部有一个方法 produceImpl
返回的是一个 ReceiveChannel,它的实现是收集上游发射的数据,然后发送到 Channel 中。
有此作为基础。我们可以 调用 asChannelFlow
将 Flow 转换 ChannelFlow, 进而转换成 Channel 。
1.1.2 produceIn —— 将 Flow 转换为单播式 Channel
produceIn()转换创建了一个produce 协程来 collect 原Flow,因此该produce协程应该在恰当时候被关闭或者取消。转换后的 Channel 拥有处理背压的能力。其基本使用方式如下:
输出结果:
查看 produceIn 源码:
1.1.3 broadcastIn —— 将 Flow 转换为广播式 BroadcastChannel。
broadcastIn 转换方式与 produceIn 转换方式实现原理一样,区别是创建出来的 BroadcastChannel。
源码如下:
使用方式见上文 BroadcastChannel。
1.2 Channel 转换为 Flow
1.2.1 consumeAsFlow/receiveAsFlow —— 将单播式 Channel 转换为 Flow
1.2.2 asFlow —— 将广播式 BroadcastChannel 转换为 Flow
二、SharedIn —— 将冷数据流转换为热数据流
三、callbackFlow —— 将基于回调的 API 转换为数据流
3.1 callbackFlow 的使用
3.2 callbackFlow 实战
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。