首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >withContext在CoroutineScope.launch之后- CoroutineScope.launch会阻塞吗?

withContext在CoroutineScope.launch之后- CoroutineScope.launch会阻塞吗?
EN

Stack Overflow用户
提问于 2020-07-05 12:47:51
回答 2查看 150关注 0票数 0

我只是被这个代码绊倒了:

代码语言:javascript
复制
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.launch是非阻塞的,所以adapterScope.launch可能要到最后才能完成。

代码语言:javascript
复制
    withContext(Dispatchers.Main) {
        submitList(items)
    }

联系到了吗?我是不是弄错了?如果没有,该如何解决呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-05 13:55:40

launch

在不阻塞当前线程的情况下启动新的协同线..。

下面是发生的事情:

  1. addHeaderAndSubmitList使用launch启动一些异步工作。工作将自然完成,或在adapterScope生命周期结束时终止,而addHeaderAndSubmitList则会立即完成。
  2. launch {}内部的任何内容都会按顺序运行。submitList(items)是在val items = ...之后调用的。每一个都有效地发生在不同的线程上,但是订单是有保证的。
票数 2
EN

Stack Overflow用户

发布于 2020-07-05 12:58:04

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62740895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档