协程拦截器:自定义 ContinuationInterceptor 改造 Flow 调度
通过实现 ContinuationInterceptor 来拦截协程恢复,从而在 Flow 的每个 emit 前后插入监控逻辑。 · 难度:入门 · +10XP
协程拦截器:自定义 ContinuationInterceptor 改造 Flow 调度
Kotlin 协程的 ContinuationInterceptor 允许开发者拦截协程的挂起与恢复。本教程将展示如何利用它构建一个 LoggingInterceptor,它在每个 emit 时打印线程和耗时,并且完全不影响原有 Flow 的时序与异常传播。我们还会讨论如何通过 interceptor 实现类似“协程上下文传播”的效果,这个技巧在分布式链路追踪中非常实用。
class TimingInterceptor : ContinuationInterceptor {
override val key = ContinuationInterceptor
override fun interceptContinuation(continuation: Continuation): Continuation {
return object : Continuation by continuation {
override fun resumeWith(result: Result) {
println("[Timing] resumed at ${System.currentTimeMillis()}")
continuation.resumeWith(result)
}
}
}
}
fun main() = runBlocking(TimingInterceptor()) {
flowOf(1, 2, 3).collect { println(it) }
}