Kotlin 协程源码阅读笔记 —— Channel 本篇文章主要介绍Channel,相对于Flow是一种冷流,而Channel的表现更加像一种热流,准备好了就开始今天的内容吧。 Channel 的简单使用 我们通常是使用Channel()方法来创建一个Channel实例,其中有以下几个参数,我来简单描述一下它们: capacity:Channel的容量,当调用send()方法发送数...
首先, 让我们回到热Channel和冷Flow的最初区别. 暂且不论热Flow是否真实存在, 冷Flow和热Channel的最基本的区别是什么? 我们很容易认为, Flow和Channel只是异步流这一基本概念的两种变体. "热"和"冷"的区别让人觉得它们的主要区别在于Channel总是在运行, 而Flow只有在你收集它时才会运行. 这里我想提出一个要求: ...
与Rxjava区别:Flow 就是 Kotlin 协程与响应式编程模型结合的产物,与Rxjava非常像,Flow 提供了很多丰富的操作符,例如 map、fliter、count 等等,相比 Rxjava ,Flow 的使用和线程切换更为简单 与Sequences区别:每一个Flow其内部是按照顺序执行的,这一点跟Sequences很类似。Flow跟Sequences之间的区别是Flow不会阻塞主...
Flow就是Kotlin协程中的流,我们可以通过它在Kotlin中进行写出流式代码,大名鼎鼎的RxJava就是流式编程的库(不过我遇到很多的人他们只会用RxJava切线程😂),在Kotlin的早期Flow的各种操作符相对于RxJava比较少,不过现在Flow的操作符也是非常的丰富,RxJava中常用的操作符在Flow中几乎都能够找到功能类似的操作符。所以如...
ChannelFlow 是一个抽象类,并且被标记为内部 Api,不应该在外部代码直接使用。 注意到它内部有一个方法 produceImpl 返回的是一个 ReceiveChannel,它的实现是收集上游发射的数据,然后发送到 Channel 中。 有此作为基础。我们可以 调用 asChannelFlow 将Flow 转换 ChannelFlow, 进而转换成 Channel 。1.1...
虽然从上面操作看和集合类型,但是Flow还是有些特殊操作符的,毕竟它是协程的一部分,和Channel不同,Flow是有生命周期的,只是以操作符的形式回调而已,比如onStart、onCompletion这两个中间操作符。 flowOf(1,2,3,4,5,6) .filter { println("filter: $it") ...
需要额外注意的是,flow后面的 lambda 表达式是一个挂起函数,里面不能使用不同的CoroutineContext来调用emit方法去发射值。因此,在flow{...}中不要通过创建新协程或使用withContext代码块在另外的CoroutineContext中调用emit方法,否则会报错。如果确实有这种需求,可以使用channelFlow操作符。
所谓冷数据流,就是只有消费时才会生产的数据流,这一点与 Channel 正对应:Channel 的发送端并不依赖于接收端。 说明 RxJava 也存在热数据流,可以通过一定的手段实现冷热数据流的转化。不过相比之下,冷数据流的应用场景更为丰富。 异常处理 Flow 的异常处理也比较直接,直接调用 catch 函数即可: 代码清单7:捕获 Flo...
在这一次分享中,发现 Flow 和 Channel 这一块儿知识是自己不怎么了解的,本文也将着重和大家聊一聊这一块儿的内容,协程部分将分为三篇,本文是第一篇: “ 《即学即用Kotlin - 协程》 《抽丝剥茧Kotlin - 协程基础篇》 《抽丝剥茧Kotlin - 协程Flow篇》 ...
Channel 通道 与 Flow 异步流是不同的 , 生产者协程 产生数据 和 消费者协程 消费数据 是同时进行的 ; 二、Channel#send 发送数据 Channel#send 函数原型 : 代码语言:javascript 复制 /** * 将指定的[element]发送到此通道,在此通道的缓冲区已满时挂起调用者 ...