协程上下文与作用域
CoroutineScope/Dispatchers/Job、SupervisorJob、取消
协程上下文与作用域
理解 CoroutineScope 和 Job 是正确使用协程的关键。
学完本章你将: 掌握 CoroutineScope/Job、SupervisorJob、取消。
CoroutineScope
kotlin
// 创建作用域
val scope = CoroutineScope(Dispatchers.IO)
scope.launch {
// 在 IO 线程执行
}
// 记得释放
scope.cancel()
SupervisorJob
kotlin
val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
scope.launch {
throw Exception("失败") // 只影响自己
}
scope.launch {
delay(1000)
println("我还在运行") // ✅ 不受影响
}
// 普通 Job:一个失败全家都取消
// SupervisorJob:各自独立
取消协程
kotlin
val job = launch {
repeat(100) { i ->
delay(100)
println("$i")
}
}
delay(500)
job.cancel() // 取消
// 协作式取消——只有挂起点检查取消
withContext 切换上下文
kotlin
suspend fun loadData() = withContext(Dispatchers.IO) {
// 在 IO 线程读取
val data = readFile()
// 返回后回到原上下文
data
}