如何使用 Kotlin Flows 轮询资源并发出它?

How to use Kotlin Flows to poll resource and emit it?

我想为 Kotlin Flows 永远循环和发出结果创建一个很好的逻辑。用例是每隔 n 分钟我需要在我的应用程序中更新一个配置,这个配置来自休息 api.

我认为一个不错的解决方案是 运行 一个“调度程序”,它在后台每 n 分钟轮询一次 api,以及一个订阅此调度程序的 ConfigService可以在调度程序发出新值时更新它自己的状态。

使用 RxJava 这将是

Observable.interval(n, TimeUnit.MINUTES)
            .flatMap( ... )

但由于我使用的是 Kotlin,所以我认为我可以使用本机 Flow 库实现相同的逻辑。那会是什么样子?我正在尝试 google 但要么没有找到正确的关键字,要么就是没有人 运行 之前遇到过同样的问题?

基本上你使用流生成器函数,调用挂起函数来获取数据和emit结果

import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.flow
import kotlin.time.minutes

flow<ApiResult> {
  while (true) {
    emit(fetchApi())
    delay(10.minutes)
  }
}

请注意,此实现是冷的 - 即它在不是 collected/observed 时停止。

将来可能会有类似 tickerFlow. The old ticker 的通道(可能转换为流量)被弃用,绝对不应该使用。