关于Kotlin CoroutineScope与Dispatchers.Main重复指定的技术问询
关于CoroutineScope与launch调度器的疑问解答
你的理解是准确的:
- L63的
private val coroutineScope = CoroutineScope(Dispatchers.Main + parentJob),是给这个协程作用域设置了默认调度器为Dispatchers.Main,后续通过该作用域启动的协程,默认会继承这个调度器配置。 - L68的
coroutineScope.launch(Dispatchers.Main) { .. },是显式指定当前协程块在Dispatchers.Main(主线程)运行。
针对你的问题:
完全不需要重复指定调度器
协程调度器遵循继承规则:当调用launch时不传入调度器参数,会自动继承所属CoroutineScope的默认调度器。这里Scope已经指定了Dispatchers.Main,所以显式写Dispatchers.Main属于冗余操作,没有实际必要。将L68改为
coroutineScope.launch {..}后,效果完全不变
这个协程块依然会在主线程运行,因为它会自动继承CoroutineScope的默认调度器Dispatchers.Main,和显式指定的行为完全一致。
补充说明:只有当你需要让当前协程脱离Scope的默认调度规则(比如执行IO耗时操作时切换到Dispatchers.IO),才需要显式指定其他调度器。
内容的提问来源于stack exchange,提问作者LiuWenbin_NO.
相关产品推荐
相关产品推荐

