Kotlin协程取消与超时
在Kotlin协程中,取消与超时是非常重要的概念。它们帮助我们管理协程的生命周期,确保在不需要时能够优雅地停止协程,避免资源浪费。本文将详细介绍如何实现协程的取消与超时,并通过实际案例展示其应用场景。
协程取消
协程取消是指在某些条件下,主动停止正在运行的协程。Kotlin协程提供了cancel()
方法来实现这一功能。
基本用法
import kotlinx.coroutines.*
fun main() = runBlocking {
val job = launch {
repeat(1000) { i ->
println("I'm sleeping $i ...")
delay(500L)
}
}
delay(1300L) // 延迟一段时间
println("main: I'm tired of waiting!")
job.cancel() // 取消协程
job.join() // 等待协程结束
println("main: Now I can quit.")
}
输出:
I'm sleeping 0 ...
I'm sleeping 1 ...
I'm sleeping 2 ...
main: I'm tired of waiting!
main: Now I can quit.
在这个例子中,我们启动了一个协程,并在1.3秒后取消了它。协程在取消后立即停止执行。
检查取消状态
在协程中,我们可以通过isActive
属性来检查协程是否仍然处于活动状态。如果协程被取消,isActive
将返回false
。
import kotlinx.coroutines.*
fun main() = runBlocking {
val job = launch {
repeat(1000) { i ->
if (!isActive) {
return@launch
}
println("I'm sleeping $i ...")
delay(500L)
}
}
delay(1300L)
println("main: I'm tired of waiting!")
job.cancelAndJoin() // 取消并等待协程结束
println("main: Now I can quit.")
}
输出:
I'm sleeping 0 ...
I'm sleeping 1 ...
I'm sleeping 2 ...
main: I'm tired of waiting!
main: Now I can quit.
在这个例子中,我们在每次循环中检查isActive
状态,如果协程被取消,则提前退出。
协程超时
协程超时是指在一定时间内未完成任务的协程将被自动取消。Kotlin协程提供了withTimeout
和withTimeoutOrNull
函数来实现超时机制。