You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Kotlin Flow每秒仅收集一次下载进度以更新通知

解决Kotlin Flow下载进度的通知限流问题

要实现每秒仅更新一次下载进度通知,你可以使用Kotlin Flow的sample操作符,它能按照指定时间间隔采样最新的进度值,忽略间隔内的所有中间发射值。

核心修改方案

直接在你的Flow收集链中添加sample操作符,指定1秒的采样间隔:

修改后的CoroutineWorker代码

myFlow.sample(1000) // 每隔1000毫秒(1秒)采样一次最新进度
    .collect { progress ->
        // 在这里更新通知中心的进度展示
    }
Result.success()

原理说明

  • sample(1000)会启动定时采样器,每隔1秒检查一次Flow的最新发射值
  • 如果1秒内进度从1%涨到5%,采样器只会取最后发射的5%来更新通知,完全忽略中间的进度值
  • 这种方式既避免了通知高频更新导致的设备卡顿,又能让用户看到当前最新进度

可选替代方案:throttleLatest

如果你需要更严格的“只保留最新值”的限流逻辑,可以使用throttleLatest操作符(需确保kotlinx-coroutines-core版本足够新):

myFlow.throttleLatest(1000)
    .collect { progress ->
        // 更新通知进度
    }

它和sample的区别在于,throttleLatest会在时间窗口结束时强制发射最后一个值,而sample仅在窗口时刻有新值时才发射。

额外优化(避免callbackFlow资源泄漏)

你的原始callbackFlow存在内存泄漏风险,建议补充awaitClose清理Java回调:

return callbackFlow {
    val callback = someJavaCallback { progress ->
        trySend(progress)
    }
    // 当Flow被取消时,移除回调避免内存泄漏
    awaitClose { removeJavaCallback(callback) }
}

内容的提问来源于stack exchange,提问作者YeahRight

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 02:01:18