来自Antonio Leiva article关于协程:
协程上下文是一组规则和配置,它们定义
协程将如何执行
withContext 是一个允许您轻松更改挂起函数的context 的函数,以确保该函数在特定线程中执行(例如来自 IO 池的线程)。为此,您可以强制挂起函数在特定线程池中执行其主体,例如:
suspend fun getAuthenticationStatus(): AuthenticationStatus = withContext(Dispatchers.IO) {
when (val result = repository.getAuthenticationStatus()) {
is Result.Success -> result.data
is Result.Error -> AuthenticationStatus.Unauthorized
}
}
这样,即使您从 UI 范围 (MainScope) 调用此挂起函数,您也可以 100% 确定挂起函数是在工作线程中执行的,并且您可以使用返回的结果更新 UI主线程,如:
MainScope().launch {
userIdentityVM.getAuthenticationStatus().run {
when (this) {
is AuthenticationStatus.Authenticated -> {
// do something
}
is AuthenticationStatus.Unauthorized -> {
// do something else
}
}
}
}
总而言之,通过使用withContext,您可以使您的挂起函数“Main Safe”。
scope 和context 的区别基本上是预期用途。
要启动协程,您通常使用launch coroutine builder,定义为CoroutineScope 上的扩展函数。
fun CoroutineScope.launch(
context: CoroutineContext = EmptyCoroutineContext,
// ...
): Job
在协程作用域上指定为参数的上下文通过加号运算符合并到协程作用域,并且优先在协程作用域指定的“默认”上下文上。这样您就可以在“父”上下文中执行代码。为了深入,我建议你 this article Roman Elizarov(Kotlin 库团队负责人 @JetBrains)。