17 | Context:万物皆为Context?
Context 的应用
- 深入了解
- 翻译
- 解释
- 总结
Kotlin协程的Context是非常关键的一环,涉及到协程的上下文、线程切换等重要概念。本文从应用的角度出发,深入浅出地介绍了CoroutineContext的使用场景,并对比源码带领读者理解其设计思路。通过示例代码演示了如何使用CoroutineContext来指定协程工作的线程池,以及介绍了Kotlin官方提供的几种内置Dispatcher。此外,文章还强调了Dispatchers.Unconfined的特殊性,以及指出不应随意使用它。最后,文章强调了在Kotlin协程中,几乎所有重要的概念都与CoroutineContext有关,包括Job、Dispatcher、CoroutineExceptionHandler、CoroutineScope等。通过对CoroutineContext元素之间的关系的描述,帮助读者建立完整的知识体系。文章内容丰富,展示了CoroutineScope、Job和Dispatcher都是CoroutineContext的一种数据类型,且CoroutineScope是对CoroutineContext的进一步封装,其核心能力全部源自于CoroutineContext。总体而言,本文为读者提供了全面的了解和掌握Kotlin协程的Context,是一篇深入浅出的技术文章。
《朱涛 · Kotlin 编程第一课》,新⼈⾸单¥59
全部留言(16)
- 最新
- 精选
- 神秘嘉Binsuspend方法需要在协程中执行,协程又一定有上下文,所以可以访问的到哈~ 也就是在suspend方法中可以访问当前协程上下文,并且拿到一些有用的信息
作者回复: 很到位~
2022-03-0213 - 夜班同志挂起函数的Continuation就有CoroutineContext
作者回复: 没错~
2022-02-2210 - 白泽丶如果为协程作用域创建时传入多个CoroutineContext,比如 Job() + Dispatcher.IO + Dispatcher.Main ,那么携程最终会在哪个线程池中执行呢
作者回复: Dispatcher之间的组合其实并没有意义,你可以将其理解为后者替换前者。不过,在大部分情况下,IDE都会直接报错并告诉你:“Dispatcher之间的组合没有意义”。 ``` fun main() { // 报错 val scope = CoroutineScope(Dispatchers.IO + Dispatchers.Main) } ```
2022-03-1245 - 白乾涛1、思考题中的方法为什么要加 suspend,加不加有什么区别吗? 2、为什么代码打印的都是 EmptyCoroutineContext,且没有 name? import kotlinx.coroutines.* import kotlinx.coroutines.GlobalScope.coroutineContext fun main() = runBlocking { printInfo(1) // 1 - EmptyCoroutineContext - null CoroutineScope(Dispatchers.IO + Job() + CoroutineName("bqt")).launch { printInfo(2) // 2 - EmptyCoroutineContext - null } delay(100L) } suspend fun printInfo(text: Any) = println("$text - $coroutineContext - ${coroutineContext[CoroutineName]?.name}")
作者回复: import kotlin.coroutines.coroutineContext 导包的时候,不要弄错了。
2022-02-2635 - 神秘嘉Bin如果你理解了第 14 讲的内容,那你一定能分析出它们的运行顺序应该是:1、4、2、3。 也有可能是1、2、4、3吧? 这个得看CPU的调度了,也有可能子协程的2线运行吧?
作者回复: ``` fun main() = runBlocking { logX("Before launch.") // 1 launch { logX("In launch.") // 2 delay(1000L) logX("End launch.") // 3 } logX("After launch") // 4 } ``` 如果只针对这个案例,由于这里不涉及到多线程,所有协程都会运行在main之上,所以,我们基本上可以认为代码的执行顺序是这样的:1、4、2、3。 但如果涉及到多线程,则可能由于主线程繁忙,coroutine2在子线程先运行,而输出:1、2、4、3。 另外,如果我们配置其他的启动模式,或者其他的Context,则可能出现其他的代码运行顺序。
2022-03-0224 - 7Promise思考题代码可以运行。coroutineContext方法是返回当前的CoroutineContext,因为runBlocking是CorouScope,CorouScope具有成员CoroutineContext,所以coroutineContext方法可以返回runBlocking的CoroutineContext。
作者回复: 嗯,没错。
2022-02-213 - 面无表情的生鱼片请教老师,经常看到 Job() + Dispatcher ,这么做是什么原因呢
作者回复: 操作符重载你肯定能理解了对吧?至于Job() + Dispatcher的含义,其实就是同时指定:parentJob,还有线程池。
2022-02-2123 - WWWarmFly请教老师, Dispatcher 内部成员的类型是CoroutineContext,这里怎么推出 Dispatcher 确实就是 CoroutineContext
作者回复: 这样的关系:Dispatcher - CoroutineContext.Element - CoroutineContext
2022-03-202 - Shanks-王冲Kotlin1.6源码package kotlin.coroutines中找到了这个,public suspend inline val coroutineContext: CoroutineContext,成员定义成suspend了,我不知道该怎么解释,贴出试试
作者回复: 没错,方向是对的,这就是我希望你们去看的coroutineContext变量,你可以再想想它的作用吗? PS:具体答案我会在第27讲里给出的。
2022-03-171 - Renext代码段6报错: Cannot access 'ExecutorCoroutineDispatcherImpl': it is private in file
作者回复: ExecutorService.asCoroutineDispatcher()是Kotlin的源码哈,不需要你写进工程里的。
2022-03-08