本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点
在Kotlin的协程库kotlinx.coroutines
中,StateFlow
和SharedFlow
是两种用于处理事件流的API,它们有相似之处,但在设计上的初衷和内在机制上有明显区别。
这次我们就对StateFlow
和SharedFlow
进行深入对比:
StateFlow
和 SharedFlow
概述
-
StateFlow:
- 一种用于持有单一最新状态值并发射给多个观察者的热流。适合用于状态管理场景,例如表示UI状态。
- 和livedata比较像,有新数据可以通知collect的一方
- 同时又具有flow的所有特点,比如可以挂起,切换线程
-
SharedFlow:
- 一种通用热流,可以发射事件流而不是仅限于持有最新状态。适合处理事件总线、观察者模式等场景。
- 也就是一对多的关系,可以有多个collector
- 同时又具有flow的所有特点,比如可以挂起,切换线程
- 和上面的StateFlow不同的是,这个不能主动通知collect方,需要不断emit元素,也就是利用了flow的功能
设计初衷不同
StateFlow
的设计是为了取代ConflatedBroadcastChannel
,用于表示状态,并且总是持有最新的状态值。SharedFlow
的设计是为了提供一个通用的、可共享的事件流机制,支持事件的重播、缓存等。
状态持有和重播不同
-
StateFlow:
- 总是持有最新的状态值。
- 新的观察者会立即收到当前持有的状态值。
- 流中的每个新值都会覆盖之前的值,即只有最新的状态值会被保留。
-
SharedFlow:
- 不会持有单一最新状态值(除非配置了重播缓存)。
- 可以配置重播机制(