gpt4 book ai didi

android - 为什么必须将 "Dispatchers.Main"添加到 Activity CoroutineScope 实现的根作业中?

转载 作者:行者123 更新时间:2023-12-05 01:26:57 31 4
gpt4 key购买 nike

abstract class ScopedAppActivity: AppCompatActivity(), CoroutineScope {
protected lateinit var job: Job
override val coroutineContext: CoroutineContext
get() = job + Dispatchers.Main

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
job = Job()

launch(Dispatchers.Main) {
try {
delay(Long.MAX_VALUE)
} catch (e: Exception) {
// e will be a JobCancellationException if the activty is destroyed
}
}
}

override fun onDestroy() {
super.onDestroy()
job.cancel()
}
}

此示例复制自 coroutine guide并由 launch(Dispatchers.Main) 扩展协程。我不明白为什么 + Dispatchers.Main需要第 4 行。如果我删除这部分 launch如果 Activity 被销毁,协程无论如何都会被取消。那么 Dispatchers.Main的原因是什么? ?为什么是 Dispatchers.IO也没有加?

最佳答案

当你写这个:

launch(Dispatchers.Main) {
try {
delay(Long.MAX_VALUE)
} catch (e: Exception) {
// e will be a JobCancellationException if the activty is destroyed
}
}

你可能没有意识到 launch实际上是用你的 ScopedAppActivity 调用的作为接收者。所以你有效地写了
this.launch(Dispatchers.Main) { ... }
launchCoroutineScope 上的扩展功能它将使用它的 coroutineContext作为起点,将其与括号中指定的任何内容结合起来。因此,在您的情况下,有效的上下文是
job + Dispatchers.Main + Dispatchers.Main

可以想象,这等于
job + Dispatchers.Main

所以当你删除 Dispatchers.Main来自您的 coroutineContext , 没有什么变化。

So what is the reason for Dispatchers.Main?



提供 Dispatchers.Main的优势在 coroutineContext是你不必每次都提供它,所以你可以写
launch { ... }

和里面的 block launch将留在 GUI 线程上,这是在 Android 和其他 GUI 应用程序上使用协程最自然的方式。

Why is Dispatchers.IO not added, too?



由于该行不是关于声明您将使用的所有调度程序,而是默认一个,因此提供多个调度程序是没有意义的。

在另一个层面上, CoroutineContext不是一个列表( + 运算符隐含了这种含义),而是一个 map 。 +语法有效,因为您添加的每个对象都声明了自己的映射键, +用于将其放入上下文的内部映射中。所以实际上不可能将两个调度员合二为一 CoroutineContext .

关于android - 为什么必须将 "Dispatchers.Main"添加到 Activity CoroutineScope 实现的根作业中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53324408/

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