Для Kotlin Coroutine, куда поместить parentJob при использовании CoroutineScope для запуска? - PullRequest
0 голосов
/ 05 мая 2020

Я видел в блоге https://medium.com/capital-one-tech/coroutines-and-rxjava-an-asynchronicity-comparison-part-2-cancelling-execution-199485cdf068

launch(parentJob + CommonPool) {
   // my suspending block
}

, где мы могли затем отменить задание в конце, т.е. parentJob.cancel(), поэтому задание launch также будет быть отменено.

Однако, если я запустил его с помощью CoroutineScope, как показано ниже, где я должен разместить свои parentJob?

CoroutineScope(Dispatchers.IO + parentJob).launch{ 
   // ...
}

или

CoroutineScope(Dispatchers.IO).launch(parentJob) {
   // ...
}

Или оба это тоже неверно?

1 Ответ

0 голосов
/ 05 мая 2020

При использовании первого подхода

val parentJob = Job()
val scope = CoroutineScope(Dispatchers.IO + parentJob)

scope.launch { 
    // will be cancelled
    // ...
}
scope.launch {
    // ...
    // will be cancelled
    launch {
        // will be cancelled
    }
}
scope.launch(NonCancellable) {
    // won't be cancelled now
}
parentJob.cancel()

Все сопрограммы, запущенные с использованием области видимости, будут иметь задание, если какая-то сопрограмма не переопределит его, передав задание в сопрограммы, например launch или async. Таким образом, выполнение job.cancel() отменит все запущенные сопрограммы, запущенные с использованием области.

При использовании второго подхода

val parentJob = Job()
val scope = CoroutineScope(Dispatchers.IO)
scope.launch(parentJob) {
    // will be cancelled
    launch {
        // will be cancelled
    }
}
scope.launch {
    // ...
    // this one won't be cancelled
}
parentJob.cancel()

Родительское задание - только применяется к сопрограмме, запущенной с использованием launch. Таким образом, только эта сопрограмма и ее дочерние элементы будут отменены, другая сопрограмма в области видимости не будет отменена путем отмены задания.

...