持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
什么是共享流?
可以通过多处订阅共享数据和状态的流,适合节省处理资源。 与仅 Flow 的区别如下。
sharedFlow.onEach {
println("1")
}.launchIn(scope)
sharedFlow.onEach {
println("2")
}.launchIn(scope)
- 即使像这样订阅多次,flow { ... }lambda 表达式端也只会调用一次
- 您可以选择处理开始/订阅结束的时间(稍后说明),但如果您没有正确指定,它将继续被订阅。
- LatestNewsActivity如果像此示例LiveData一样转换它 并设置observe参数,LifecycleOwner则只能在显示时订阅。各种高功能
- replay:在订阅的那一刻接收过去的n个值
- buffer:当多个订阅者和处理需要时间时,它会缓冲第一次执行的处理并加速第二次和后续的时间(很难用一个词来解释......这个很容易理解)
什么是状态流?
专注于状态保留的共享流。它类似于 LiveData,或者说是真正的继承者。
- 需要初始值
- .value您可以在以下位置接收当前状态
- .value也可以 使用 MutableStateFlow 进行替换
- 不需要协程范围
- launchIn接收最新值之一
- 不接收相同值的分配
- 当值连续更改而不等待时,只接收最后一个值。
- 换言之,如果“状态”不是“持有”,则不认为是“状态变化”。 与 LiveData 的区别在于,这篇文章通俗易懂。
sharedFlow然后,如果在打开视图时正在处理流(例如在服务器通信期间),我想知道如何显示最新值。但是,由于缓存stateFlow了.value最新的值,因此您不必犹豫。
初始化方法
MutableSharedFlow使用( link ), MutableStateFlow( link )像这样初始化。
或者,使用shareIn( link ), stateIn( link )像这样进行转换。shareIn返回一个sharedFlow实例,并stateIn返回一个stateFlow实例。
很重要一点
不要对函数的返回值做任何事情shareIn。stateIn这样做会为每个函数调用创建一个新的SharedFlow或,StateFlow浪费资源。
还有,如果一个这样userId的输入值的流,用不同的输入值多次启动,并且订阅是共享的,结果会不正确。这是一个不应该轻易shareIn共享stateIn
指定处理开始时间
flow { ... }lambda 表达式处理开始时间是
shareIn使用“共享开始”选项,shareIn在之后立即永久启动Eagerly 订阅后永久开始Lazily 仅在订阅时启用WhileSubscribed
毕竟哪一个更好
……视情况而定。重要的是根据您的要求正确使用SharedFlow/ 。StateFlow
如果真的迷路了,
订阅位置的结果不应该乱序 不要浪费资源 让我们一起做决定。