Android 在CoroutineScope.launch之后使用上下文-CoroutineScope.launch会被阻止吗?

Android 在CoroutineScope.launch之后使用上下文-CoroutineScope.launch会被阻止吗?,android,kotlin-coroutines,Android,Kotlin Coroutines,我刚刚偶然发现了以下代码: fun addHeaderAndSubmitList(list: List<SleepNight>?) { adapterScope.launch { val items = when (list) { null -> listOf(DataItem.Header) else -> listOf(DataItem.Header) + list.map { DataItem.

我刚刚偶然发现了以下代码:

fun addHeaderAndSubmitList(list: List<SleepNight>?) {
    adapterScope.launch {
        val items = when (list) {
            null -> listOf(DataItem.Header)
            else -> listOf(DataItem.Header) + list.map { DataItem.SleepNightItem(it) }
        }
        // isn't there any code required to wait for the
        // adapterScope.launch coroutine to finish?
        withContext(Dispatchers.Main) {
            submitList(items)
        }
    }
}

到达了吗?我错了吗?如果没有,如何修复它?

启动{}中的代码在adapterScope中以阻塞方式顺序运行,这意味着withContext(Main)上面的所有代码都将在切换上下文以将列表提交给主线程上的适配器之前运行并完成


整个代码块可能在默认或IO上下文中运行,因此它在主线程外以阻塞方式运行,直到它到达withContext(main)将结果发布到主线程。

启动{}内的代码在adapterScope内以阻塞方式顺序运行,这意味着withContext之上的所有代码(Main)在切换上下文以将列表提交到主线程上的适配器之前运行并完成

整个代码块可能在默认或IO上下文中运行,因此它在主线程外以阻塞方式运行,直到到达withContext(main)以将结果发布到主线程。

请参阅

在不阻塞当前线程的情况下启动新的协同程序[…]

下面是发生的情况:

  • addHeaderAndSubmitList
    使用
    launch
    启动一些异步工作。该工作将自然完成,或在
    adapterScope
    的生命周期结束时终止。同时
    addHeaderAndSubmitList
    立即完成

  • launch{}
    中的任何内容都会按顺序运行。
    submitList(items)
    val items=…
    之后调用。每个事件都在不同的线程上有效地发生,但顺序是有保证的

  • 在不阻塞当前线程的情况下启动新的协同程序[…]

    下面是发生的情况:

  • addHeaderAndSubmitList
    使用
    launch
    启动一些异步工作。该工作将自然完成,或在
    adapterScope
    的生命周期结束时终止。同时
    addHeaderAndSubmitList
    立即完成

  • launch{}
    中的任何内容都会按顺序运行。
    submitList(items)
    val items=…
    之后调用。每个事件都在不同的线程上有效地发生,但顺序是有保证的


  • 你能澄清一下问题是什么吗?你被困在哪里了?如果问题只是你添加的注释,那么答案是否定的。如果是问题,我会提供解释是的,只是注释才是问题所在。我一直认为协程运行非阻塞,如果我想让它们运行阻塞,那么就有
    runBlocking
    哦,我明白了。我把
    }
    结束
    启动
    val项[..]
    弄混了。我的错):你能澄清一下问题是什么吗?你被困在哪里?如果问题只是你添加的评论,那么答案是否定的。如果是问题,我将提供解释是的,只有评论才是问题。我一直认为协程是非阻塞运行的,如果我想让它们运行阻塞,那么就有了
    runBlocking
    。哦,我明白了。我混淆了
    }
    结束
    启动
    val项[…]
    。我的错):两个答案都是正确的,但当我阅读此答案时,它会发出“单击”,因为它明确指出
    addHeaderAndSubmitList
    使用
    launch
    。整个方法主体是协同程序的一部分,这就是我的错误所在,因为我混淆了两个
    }
    两个答案都是正确的,但当我阅读此答案时,它发出了“click”,因为它明确说明
    addHeaderAndSubmitList
    使用
    launch
    。整个方法体是协同程序的一部分,这就是我的错误所在,因为我混淆了两个
    }
        withContext(Dispatchers.Main) {
            submitList(items)
        }