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

god*_*zsa 6 coroutine kotlin kotlin-coroutines kotlin-flow

我想为 Kotlin Flows 的永久循环和发出结果制定一个很好的逻辑。用例是,每 n 分钟我需要更新应用程序中的配置,并且此配置来自其余 api。

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

使用 RxJava 这将是

Observable.interval(n, TimeUnit.MINUTES)
            .flatMap( ... )
Run Code Online (Sandbox Code Playgroud)

但由于我使用 Kotlin,我认为我可以使用原生 Flow 库实现相同的逻辑。那会是什么样子?我试图用谷歌搜索,要么没有找到正确的关键字,要么之前没有人遇到过同样的问题?

hra*_*ach 7

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

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

flow<ApiResult> {
  while (true) {
    emit(fetchApi())
    delay(10.minutes)
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,此实现是冷的 - 即,当未收集/观察时它会停止。

未来可能会有像tickerFlow这样的东西。旧的通道代码(可能转换为流量)已被弃用,绝对不应该使用。