【问题标题】:Kotlin Flow only collect every secondKotlin Flow 仅每秒收集一次
【发布时间】:2022-12-15 05:50:21
【问题描述】:

我有一个下载文件的流程。该流发出下载进度。我想在手机通知中心显示进度,但每秒只更新一次值以防止设备滞后。

我的流程:

return callbackFlow {
  someJavaCallback { progress ->
    trySend(progress)
  }

  close()
}

我的 CoroutineWorker,它显示通知并下载文件:

myFlow.collect { // update notification }
Result.Success()

我的问题是,如何“限制”收集,例如收集 1%,但 1 秒后它收集 5% 并忽略这两点之间的所有值

【问题讨论】:

    标签: kotlin coroutine kotlin-flow


    【解决方案1】:
    fun <T> Flow<T>.throttleLatest(delayMillis: Long): Flow<T> = this
      .conflate()
      .transform {
        emit(it)
        delay(delayMillis)
      }
    

    来源:https://github.com/Kotlin/kotlinx.coroutines/issues/1446#issuecomment-1198103541

    【讨论】:

    • 为简单起见,您可以将 transform 替换为 onEach,这样您就不需要重新发出值。
    猜你喜欢
    • 2022-06-10
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    相关资源
    最近更新 更多