kotlin - Job 作为 CoroutineScope 和 launch 的参数有什么不同?

标签 kotlin kotlin-coroutines

这两个代码运行完全相同。将 Job 放入 CoroutineScope 并启动有什么不同?

private val job = CoroutineScope(Dispatchers.Main).launch(start = CoroutineStart.LAZY) {
    for(i in 10 downTo 0) {
        Log.d("test", ": $i")
        delay(1000)
    }
}

CoroutineScope(Dispatchers.Main+job).launch{ }

CoroutineScope(Dispatchers.Main).launch(job) { }

最佳答案

从技术上讲,两者都会导致相同的行为,但要点是两者都不是使用 CoroutineScope() 工厂的好方法。这是编写相同内容的惯用方式:

GlobalScope.launch(Dispatchers.Main+job) { ... }

如果这引起了您的注意(“不要使用 GlobalScope!”),那是因为它应该 — 您的示例只是犯同样错误的另一种方式,代码更冗长。您构造一个 CoroutineScope 而不持有对它的引用,从而导致与 GlobalScope 单例完全相同的无限和不可取消的范围。

此外,您使用作为实际协程句柄的 Job 实例的方式也是错误的:与协程范围关联的作业应该是从 Job()SupervisorJob()。它的唯一目的是作为取消整个作用域或检查其状态的中心点。

关于kotlin - Job 作为 CoroutineScope 和 launch 的参数有什么不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67095434/

相关文章:

android - 修剪字符串函数中的 "it <= ' '"是什么意思

android - Kotlin Android Studio 在调用另一个函数之前等待一个函数完成

function - Kotlin : can you explain member extension functions?

java - 在 Java 类中调用 Kotlin 挂起函数

android - 我怎么知道特定协程调度程序使用的线程数是多少?

android - 在 Kotlin 协程中等待 LiveData 结果

android - 将 kotlin 协程与 room 一起使用

android - Long 无法转换为 java.lang.Integer SharedPreference

java - 如何使带有 List<> 的 kotlin 函数可从 Java 调用

gradle - 在 Kotlin 多平台中使用 gradle shadow