-
CoroutineContext是一组用于定义协程行为的元素
- Job:控制协程的生命周期
- CoroutineDispatcher:向合适的线程分发任务
- CoroutineName:协程的名称,调试的时候很有用
- CoroutineExceptionHandler:处理未被捕捉的异常
-
协程上下文继承
对于新创建的协程,它的CoroutineContext会包含一个全新的Job实例,它会帮助我们控制协程的生命周期,而剩下的元素会从CoroutineContext的父类继承,该父类可能是另外一个协程或者创建该协程的CoroutineScope。
val b = runBlocking {
val scope = CoroutineScope(Job()+Dispatchers.IO+CoroutineName("test"))
val job= scope.launch {
//新的协程会将CoroutineScope作为父级
println("${coroutineContext[Job]} ${Thread.currentThread().name}")
val result = async {
//通过async创建的新协程会将当前协程作为父级
println("${coroutineContext[Job]} ${Thread.currentThread().name}")
}.await()
}
job.join()
}
输出结果:
25023-25103 I/System.out: StandaloneCoroutine{Active}@1b69ce5 DefaultDispatcher-worker-2
25023-25102 I/System.out: DeferredCoroutine{Active}@cacc3ba DefaultDispatcher-worker-1
协程上下文 = 默认值 + 继承的CoroutineContext +参数
- 一些元素包含默认值:Dispatchers.Default 是默认的CoroutineDispatcher,以及“coroutine”作为默认的CoroutineName;
- 继承的CoroutineContext 是CoroutineScope或者其福鞋城的CoroutineContext;
- 传入协程构建器的参数的优先级高于继承的上下文参数,因此会覆盖对应的参数值。
val b = runBlocking {
val coroutineExceptionHandler = CoroutineExceptionHandler { _, exception ->
println("Caught $exception")
}
val scope = CoroutineScope(Job() + Dispatchers.Main + coroutineExceptionHandler)
val job = scope.launch(Dispatchers.IO) {//在此指定的Dispatchers.IO,会覆盖Dispatchers.Main
//新的协程会将CoroutineScope作为父级
println("${coroutineContext[Job]} ${Thread.currentThread().name}")
}
job.join()
}