Kotlin协程范围定义

时间:2019-02-22 15:10:22

标签: kotlin kotlinx.coroutines kotlin-coroutines

假设我有一个名为CryptographyScope的协程范围:

object CryptographyScope : CoroutineScope {
     override val coroutineContext: CoroutineContext =
        Dispatchers.IO + CoroutineName("CryptographyScope")
}

因此,在我的应用程序中的许多地方,我都叫CryptographyScope.async

CryptographyScope.async {
    cryptographyService.decrypt(value) 
} 
  • cryptographyService.decrypt(value)之一失败并引发异常时会发生什么?它会在执行时取消应用程序中使用CryptographyScope的所有协程吗?

  • CryptographyScope应该是单例吗?

2 个答案:

答案 0 :(得分:0)

CoroutineScope定义一个范围,您可以在其中包含,界定和跟踪所有并发操作,并将它们与应用程序实体的生命周期绑定在一起。

我打算通过我创建的decrypt的自定义范围来调用CryptographyScope。但是,这是不对的,因为我没有一个定义了生命周期的实体,因此无法避免发生泄漏。

正确的做法是:

fun decryptAll() = coroutineScope {
    async { 
        cryptographyService.decrypt(value1) 
    }
    async { 
        cryptographyService.decrypt(value2) 
    }
}

答案 1 :(得分:0)

GlobalScope.launch {}在“全局”范围内启动一个新的协程,而启动{}在CoroutineScope上启动一个新的协程。

例如

    fun main() {
        println("1. Let's start")
        runBlocking {
            launch { 
                delay(1000)
                println("3. coroutine ONE")
            }

            launch { 
                delay(500)
                println("2. coroutine TWO")
            }
        }

    println("4. Only when the children inside runBlocking complete, execution follows on this line")
}

在上面的代码段中,仅在runBlocking {}内定义的两个协程都完成时,才会执行第4行。

现在让我们尝试使用GlobalScope.launch {}运行相同的代码:

fun main() {
    println("1. with GlobalScope.launch {}")
    runBlocking {
        GlobalScope.launch {
            delay(1000)
            println("3. coroutine ONE ")
        }

        GlobalScope.launch {
            delay(100)
            println("2. coroutine TWO")
        }
    }

    println("4. This line will execute even if the coroutines inside runBlocking did not complete.")
}

在上面的代码片段4中。即使runBlocking内部的协程未完成,该行也将执行。

但是,在上面的示例中启动的协程在单独的“全局”范围内运行,其中runBlocking无法对其进行控制。