首页 > 解决方案 > CoroutineScope 和 withContext 之间的 Kotlin 区别

问题描述

要更改函数中的线程,我使用 CoroutineScope 或 withContext。我不知道有什么区别,但是使用 CourineScope 我也可以使用处理程序。

例子:

private fun removeViews(){
    CoroutineScope(Main).launch(handler){
        gridRoot.removeAllViews()
    }
}

private suspend fun removeViews(){
    withContext(Main){
        gridRoot.removeAllViews()
    }
}

我从一个在后台线程 (IO) 上工作的协程调用这个函数。有比另一个更合适的吗?

标签: androidkotlinkotlin-coroutines

解决方案


这两者实际上是完全不同的,你只是碰巧有一个你没有体验到差异的用例:

CoroutineScope(Main).launch(handler){

这会启动一个独立运行的并发协程。

withContext(Main){

这是一个仅在其内部的代码完成时才完成的函数,并返回其结果。这是你应该这样做的方式。

第一种方法 withCoroutineScope有另一个缺陷,它绕过了结构化并发。您创建了一个没有父级的临时协程范围,因此如果需要更长的时间才能完成并且您的 GUI 被删除(用户导航离开当前活动),则不会自动清理。

你实际上不应该使用这个CoroutineScope(Main)成语,我认为没有一个实例是合适的。如果你明确地想避免结构化并发,写起来还是更好更干净

GlobalScope.launch(Main + handler) {

并且具有几乎相同的效果。

如果您想要一个适合结构化并发的并发协程,请使用

fun CoroutineScope.removeViews() {
    launch {
        gridRoot.removeAllViews()
    }
}

注意我删除了handler参数,子协程忽略它,因为它将任何失败转发给它的父协程,这正是你想要的。父协程应该安装一个异常处理程序。


推荐阅读