欢迎光临散文网 会员登陆 & 注册

社区说|Kotlin Flow 的原理与设计哲学

2023-03-05 17:45 作者:小指针ptr  | 我要投稿

Kotlin Flow 的原理与设计哲学

一、基本用法

Flow:流,有上游和下游,上游发射数据、下游接收数据

上游:Flow

下游:FlowCollector

设计的巧妙之处:Flow 有collect(收集)的能力,FlowCollector 有 emit(发射)的能力

Flow的collect 函数其实在发射数据,FlowCollector的 emit 函数其实是在接收数据,使用时省略了emit函数声明。

二、“冷”数据流背后的原理

数据流的含义:无收集者时不发射数据。无下游时上游不发数据。

数据流的另一特征:

执行顺序如注释所示:一次 emit 对应一次 collect。

只有当数据被需要时,才会被触发发射数据操作。便于开发者写出高效代码

Flow在源码中的体现:


22:23


1、执行Flow 的 collect 函数:

2、执行SafeFlow 的collectSafely 函数:

3、执行 SafeCollector的 block 表达式。该 block 表达式即为开发者定义的 flow 函数的参数:

4、执行 Flow 的 collect 函数:

5、执行 FlowCollector 的 emit 函数,通知上游发数据:

6、启动协程,执行私有函数 emit :

7、执行 emitFun 函数并返回:

8、代码调用到开发者定义的 FlowCollector的emit 函数,接收数据:

Flow 的 collect 函数和FlowCollector 的 emit 函数都是提供给对方调用的。

总结1:“冷”数据流

Flow的架构模型

三、Flow中间操作符用法

中间操作符:filter、map、take

在一次 emit 中,中间操作符的执行过程与代码一一对应:

四、Flow的携程作用域细节

可以在协程作用域外创建 Flow,在协程内收集时执行:

创建 flow 的函数不是一个挂起函数。在创建数据和中间操作的过程中无需协程作用域,在下游收集处需要协程作用域:

总结2:最小化协程依赖

五、源码背后的数据流串联思想

Flow 操作符源码:

以 filter 为例,内部函数调用的返回值始终是 Flow。执行顺序如注释所示:

map操作符,在emit前进行一次转换:

总结3:数据流串联。

通过一层一层的包装,实现串联的模型。

从下到上一层一层触发,从上到下一层一层转换:

总结

Flow的设计哲学

  1. “冷”数据流:冷、懒
  2. 最小化协程依赖:结构化并发、上下文保护
  3. 结构化并发:父子协程、生命周期联动
  4. 上下文联动:每次emit 时的上下文不可变更
  5. 数据流串联

问答互动

1、SharedFlow 和 StateFlow的应用场景?

StateFlow 用来替代 LiveData,可以使用 flow 的操作符,ui 层无需处理;SharedFlow 用在多个接收者场景

2、 为什么说 Flow 天然支持背压?

上一个 emit 函数没有执行完时,下一个 emit 函数无法执行

3、阅读Flow源码的推荐顺序?

1、首先要熟悉 kotlin 的高阶函数

2、然后要熟悉协程的基础概念

3、再去看 flow 的源码,了解实现原理

社区说|Kotlin Flow 的原理与设计哲学的评论 (共 条)

分享到微博请遵守国家法律