我只是被这个代码绊倒了:
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可能要到最后才能完成。
withContext(Dispatchers.Main) {
submitList(items)
}联系到了吗?我是不是弄错了?如果没有,该如何解决呢?
发布于 2020-07-05 13:55:40
见launch。
在不阻塞当前线程的情况下启动新的协同线..。
下面是发生的事情:
addHeaderAndSubmitList使用launch启动一些异步工作。工作将自然完成,或在adapterScope生命周期结束时终止,而addHeaderAndSubmitList则会立即完成。launch {}内部的任何内容都会按顺序运行。submitList(items)是在val items = ...之后调用的。每一个都有效地发生在不同的线程上,但是订单是有保证的。发布于 2020-07-05 12:58:04
启动内的代码{}在adapterScope内以阻塞方式顺序运行,这意味着在切换上下文以将列表提交给主线程上的适配器之前,withContext( main )上的所有代码都将运行并完成。
整个代码块可能在默认或IO上下文中运行,因此它以阻塞方式在主线程之外运行,直到到达withContext( main )将结果发布到主线程。
https://stackoverflow.com/questions/62740895
复制相似问题