【问题标题】:GlobalScope.launch(coroutineContext) vs launch() in a class extends CoroutineScope类中的 GlobalScope.launch(coroutineContext) 与 launch() 扩展了 CoroutineScope
【发布时间】:2020-01-15 20:41:37
【问题描述】:

如下代码所示,

  1. 两个launchWithXXX 函数会在MainScope 中运行吗?他们是否为运行这两个作业创建了相同的协程环境?
  2. 调用dispose()时这两个函数会被取消吗?
class A : CoroutineScope by MainScope() {

    fun launchWithGlobalScope() {
        GlobalScope.launch(coroutineContext) {
            // Run jobs
        }
    }

    fun launchWithClassScope() {
        launch {
            // Run jobs too
        }
    }

    fun dispose() {
        cancel()
    }
}

【问题讨论】:

    标签: kotlin kotlin-coroutines


    【解决方案1】:

    答案为 1:否。MainScope 定义了使用 UI 组件做某事的范围。所以它在你平台的 UI 线程中运行。 GlobalScope 是一个具有自己的线程池的作用域,并使用其中一个线程运行协程。

    答案 2:cancel 只会停止您的示例中的 MainScope 以及使用此范围创建的所有协程。

    【讨论】:

    • 谢谢!在为视图创建侦听器时,我在 Android Anko 框架中找到 GlobalScope.launch(coroutineContext),这些方法只接受 CoroutineContext 参数,而不接受 CoroutineScope see here。这是否意味着当我调用 Activity() : CoroutineScope by MainScope()cancel() 时,我无法取消侦听器内部的工作?使用这些Anko 方法有什么潜在的危险吗?
    • 我不是 Android 开发人员,因此我没有使用 Anko。也就是说,来自 Anko 的代码看起来并没有包含结构化的并发更改。一年前,协程添加了结构化并发,从那时起就不允许 launch 没有范围的协程。一个(不鼓励的)后备方案是使用GlobalScope。但是这样就不可能取消这些协程。要回答您的问题,如果您使用这些方法,可能会在视图被释放后调用已注册的处理程序,这可能很危险。
    • GlobalScope 的协程上下文为空,因此当您将MainScope()coroutineContext 传递给launch 时,没有区别。第一个 launch 只是第二个更令人困惑的变体。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    相关资源
    最近更新 更多