-
CoroutineContext是一組用于定義協(xié)程行為的元素
- Job:控制協(xié)程的生命周期
- CoroutineDispatcher:向合適的線程分發(fā)任務(wù)
- CoroutineName:協(xié)程的名稱恃疯,調(diào)試的時候很有用
- CoroutineExceptionHandler:處理未被捕捉的異常
-
協(xié)程上下文繼承
對于新創(chuàng)建的協(xié)程瓶佳,它的CoroutineContext會包含一個全新的Job實例,它會幫助我們控制協(xié)程的生命周期自赔,而剩下的元素會從CoroutineContext的父類繼承,該父類可能是另外一個協(xié)程或者創(chuàng)建該協(xié)程的CoroutineScope升薯。
val b = runBlocking {
val scope = CoroutineScope(Job()+Dispatchers.IO+CoroutineName("test"))
val job= scope.launch {
//新的協(xié)程會將CoroutineScope作為父級
println("${coroutineContext[Job]} ${Thread.currentThread().name}")
val result = async {
//通過async創(chuàng)建的新協(xié)程會將當前協(xié)程作為父級
println("${coroutineContext[Job]} ${Thread.currentThread().name}")
}.await()
}
job.join()
}
輸出結(jié)果:
25023-25103 I/System.out: StandaloneCoroutine{Active}@1b69ce5 DefaultDispatcher-worker-2
25023-25102 I/System.out: DeferredCoroutine{Active}@cacc3ba DefaultDispatcher-worker-1
協(xié)程上下文 = 默認值 + 繼承的CoroutineContext +參數(shù)
- 一些元素包含默認值:Dispatchers.Default 是默認的CoroutineDispatcher侮措,以及“coroutine”作為默認的CoroutineName规伐;
- 繼承的CoroutineContext 是CoroutineScope或者其福鞋城的CoroutineContext;
- 傳入?yún)f(xié)程構(gòu)建器的參數(shù)的優(yōu)先級高于繼承的上下文參數(shù)最冰,因此會覆蓋對應(yīng)的參數(shù)值瘦棋。
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
//新的協(xié)程會將CoroutineScope作為父級
println("${coroutineContext[Job]} ${Thread.currentThread().name}")
}
job.join()
}