При использовании первого подхода
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
. Таким образом, только эта сопрограмма и ее дочерние элементы будут отменены, другая сопрограмма в области видимости не будет отменена путем отмены задания.