当前位置: 首页 > news >正文

3.3-CoroutineScope/CoroutineContext:从挂起函数里获取 CoroutineContext

文章目录

在 CoroutineScope 获取 CoroutineContext 很简单,只需要在使用的地方使用 coroutineContext 属性就能拿到。比如获取运行的线程:

val scope = CoroutineScope(EmptyCoroutineContext)
scope.launch {val dispatcher = coroutineContext[ContinuationInterceptor]println("Dispatcher: $dispatcher")
}输出结果:
Dispatcher: Dispatchers.Default

但是如果想在一个挂起函数里拿 coroutineContext,好像就只能作为 CoroutineScope 的扩展函数才能拿到。比如还是上面获取运行线程的例子:

val scope = CoroutineScope(EmptyCoroutineContext)
scope.launch {showDispatcher()
}private suspend fun CoroutineScope.showDispatcher() {// 挂起函数只能是 CoroutineScope 的扩展函数,才能拿到 coroutineContextval dispatcher = coroutineContext[ContinuationInterceptor]println("Dispatcher: $dispatcher")
}

我们知道挂起函数肯定是运行在协程上的,也就是外面肯定会包一个 CoroutineScope,那么 [在挂起函数获取 CoroutineScope 的 coroutineContext] 也是合理的要求所以 kotlin 是有提供给我们在挂起函数获取 coroutineContext 的函数,代码编写也是 coroutineContext

// 导入了一个包,挂起函数就能拿到 coroutineContext
import kotlin.coroutines.coroutineContext val scope = CoroutineScope(EmptyCoroutineContext)
scope.launch {showDispatcher()
}private suspend fun showDispatcher() {// 挂起函数此时不是 CoroutineScope 的扩展函数了,也能拿到 coroutineContextval dispatcher = coroutineContext[ContinuationInterceptor]// 另一个获取方式:// val dispatcher = currentCoroutineContext()[ContinuationInterceptor]println("Dispatcher: $dispatcher")
}CoroutineScope.ktpublic suspend inline fun currentCoroutineContext(): CoroutineContext = coroutineContext

另外提供的 currentCoroutineContext() 函数虽然也是拿的 coroutineContext,它主要的作用是在协程使用时避免命名冲突的。比如下面的例子:

private fun flowFunction() {flow<String> {coroutineContext}GlobalScope.launch {flow<String> {// 和上面的 flow 拿的 coroutineContext 不是一个东西// 这里拿的是 launch 的 CoroutineScope 的 coroutineContext 属性coroutineContext // 获取到 flow 的 coroutineContextcurrentCoroutineContext() }}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 总结:Python语法
  • [JAVA]初识线程池及其基本应用
  • leetcode406:根据身高重建队列
  • FastDFS的安装(分布式项目中的图片管理)
  • 《晶核》服务器架构——第二篇
  • fastap之使用 contextvars 实现上下文变量
  • Ps:首选项 - 常规
  • Unity+Addressable
  • 15.CentOS7升级内核
  • Android 关于设备定屏/黑屏/冻屏/ANR那些事
  • 【北京仁爱堂】脖子歪斜,拉扯疼痛怎么办?规律的生活让痉挛性斜颈的恢复事半功倍!
  • 微信小程序登陆
  • 【精选】基于springboot个人理财APP(源码+设计+辅导)
  • MATLAB 低版本Matlab-读取LAS格式点云文件并可视化(78)
  • C++ 设计模式——迭代器模式
  • [ JavaScript ] 数据结构与算法 —— 链表
  • [deviceone开发]-do_Webview的基本示例
  • 【面试系列】之二:关于js原型
  • 2017 前端面试准备 - 收藏集 - 掘金
  • AHK 中 = 和 == 等比较运算符的用法
  • Akka系列(七):Actor持久化之Akka persistence
  • Android框架之Volley
  • FastReport在线报表设计器工作原理
  • JavaScript中的对象个人分享
  • java第三方包学习之lombok
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • PAT A1017 优先队列
  • Spring框架之我见(三)——IOC、AOP
  • 初识 webpack
  • 高程读书笔记 第六章 面向对象程序设计
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 记录:CentOS7.2配置LNMP环境记录
  • 聊聊hikari连接池的leakDetectionThreshold
  • 那些被忽略的 JavaScript 数组方法细节
  • 使用 @font-face
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 学习HTTP相关知识笔记
  • 学习JavaScript数据结构与算法 — 树
  • 源码安装memcached和php memcache扩展
  • 【云吞铺子】性能抖动剖析(二)
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​香农与信息论三大定律
  • ![CDATA[ ]] 是什么东东
  • #if 1...#endif
  • #职场发展#其他
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (10)STL算法之搜索(二) 二分查找
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (分布式缓存)Redis哨兵
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355