Coroutine Context: Accessing and Creating Context
Learn about coroutine context and how to access context in a suspending function or create a unique context.
We'll cover the following...
So CoroutineContext is just a way to hold and pass data. By default, the parent passes its context to the child, one of the parent-child relationship effects. We say that the child inherits context from its parent.
package kotlinx.coroutines.app
import kotlinx.coroutines.*
fun CoroutineScope.log(msg: String) {
val name = coroutineContext[CoroutineName]?.name
println("[$name] $msg")
}
fun main() = runBlocking(CoroutineName("main")) {
log("Started") // [main] Started
val v1 = async {
delay(500)
log("Running async") // [main] Running async
42
}
launch {
delay(1000)
log("Running launch") // [main] Running launch
}
log("The answer is ${v1.await()}")
// [main] The answer is 42
}
Parent-child relationship
Each child might have a specific context defined in the argument. This context overrides the one from the parent.
package kotlinx.coroutines.app
import kotlinx.coroutines.*
fun CoroutineScope.log(msg: String) {
val name = coroutineContext[CoroutineName]?.name
println("[$name] $msg")
}
fun main() = runBlocking(CoroutineName("main")) {
log("Started") // [main] Started
val v1 = async(CoroutineName("c1")) {
delay(500)
log("Running async") // [c1] Running async
42
}
launch(CoroutineName("c2")) {
delay(1000)
log("Running launch") // [c2] Running launch
}
log("The answer is ${v1.await()}")
// [main] The answer is 42
}Overriding
Here is a simplified formula to calculate a coroutine context.
defaultContext + parentContext + childContext
Since new elements always replace old ones with the same key, the child context always ...
Ask