gpt4 book ai didi

android - CoroutineScope 和 withContext 之间的 Kotlin 区别

转载 作者:行者123 更新时间:2023-12-02 11:57:58 25 4
gpt4 key购买 nike

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

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

private suspend fun removeViews(){
withContext(Main){
gridRoot.removeAllViews()
}
}
我从一个在后台线程 (IO) 上工作的协程调用这个函数。有比另一个更合适的吗?

最佳答案

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

CoroutineScope(Main).launch(handler){


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

withContext(Main){


这是一个仅在其内部的代码完成并返回其结果时才完成的函数。这是你应该这样做的方式。
第一种方法,使用 CoroutineScope , 还有一个缺陷是它规避了结构化并发。您创建了一个没有父级的临时协程范围,因此如果需要更长的时间才能完成并且您的 GUI 被删除(用户导航离开当前 Activity ),则不会自动清理。
您实际上不应该使用 CoroutineScope(Main)成语,我认为没有一个合适的例子。如果你明确地想避免结构化并发,写起来仍然更好更干净
GlobalScope.launch(Main + handler) {
并且具有几乎相同的效果。
如果您想要一个适合结构化并发的并发协程,请使用
fun CoroutineScope.removeViews() {
launch {
gridRoot.removeAllViews()
}
}
注意我删除了 handler参数,子协程忽略它,因为它将任何失败转发给它的父协程,这正是你想要的。父协程应该安装一个异常处理程序。

关于android - CoroutineScope 和 withContext 之间的 Kotlin 区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63902953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com