CoroutineScope(Dispatchers.IO + Job())与CoroutineScope(Dispatchers.IO)+Job()的差异
两种CoroutineScope创建方式的区别
这两种写法最终功能完全等价,仅执行流程略有不同,本质上都会得到持有Dispatchers.IO + Job()上下文的CoroutineScope:
执行流程差异
第一种写法:
val scope1 = CoroutineScope(Dispatchers.IO + Job())先将
Dispatchers.IO调度器和新建的Job()合并为完整的CoroutineContext,再直接用该上下文初始化CoroutineScope。第二种写法:
val scope2 = CoroutineScope(Dispatchers.IO) + Job()- 先以
Dispatchers.IO为上下文创建CoroutineScope(此时该scope的上下文仅包含调度器,无Job); - 调用
CoroutineScope的plus扩展方法,将原scope的上下文与新建的Job()合并,返回持有合并后上下文的新CoroutineScope。
- 先以
核心结论
CoroutineScope.plus方法的内部实现就是基于原上下文与传入上下文创建新的CoroutineScope,因此两种写法最终得到的scope完全一致,不存在功能差异,只是代码执行顺序不同——第一种先合并上下文再创建scope,第二种先创建基础scope再合并上下文。
内容的提问来源于stack exchange,提问作者Nguyễn Mạnh Cường
相关产品推荐
相关产品推荐

