Kotlin Flow 基础(二)

188 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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

如果真的迷路了,

订阅位置的结果不应该乱序 不要浪费资源 让我们一起做决定。