Kotlin Coroutine SupervisorJob отмена поведения - PullRequest
2 голосов
/ 06 января 2020

код:

viewModelScope.launch(CoroutineExceptionHandler { _, _ ->
                Log.e("TAG", "task 1")
            }) {
                try {
                    Log.e("TAG", "task 1 start")
                    delay(3000)
                    Log.e("TAG", "task 1 finished")
                } catch (ex: Exception) {
                    Log.e("TAG", "task 1 cancelled " + ex)
                }
            }

    launch = viewModelScope.launch(CoroutineExceptionHandler { _, _ ->
        Log.e("TAG", "handler 1" + myJob?.isCancelled)
    }) {

        myJob = SupervisorJob()
        launch(myJob!! + CoroutineExceptionHandler { _, _ ->
            Log.e("TAG", "handler 2 " + myJob?.isCancelled)
        }) {

            delay(300)
            launch {
                try {
                    Log.e("TAG", "task 2 start")
                    delay(5000)
                    Log.e("TAG", "task 2 finished")
                } catch (ex: Exception) {
                    Log.e("TAG", "task 2 ex " + ex)
                }
            }

            launch {
                delay(2000)
                throw Exception()
            }

        }

        launch {
            try {
                Log.e("TAG", "task 3 start")
                delay(3000)
                Log.e("TAG", "task 3 finished")
            } catch (ex: Exception) {
                Log.e("TAG", "task 3 ex " + ex)
            }
        }
    }

вывод:

2020-01-06 09:47:56.462 7159-7159/? E/TAG: task 1 start
2020-01-06 09:47:56.496 7159-7159/? E/TAG: task 3 start
2020-01-06 09:47:56.798 7159-7159/com.mvvm.template.debug E/TAG: task 2 start
2020-01-06 09:47:58.822 7159-7159/com.mvvm.template.debug E/TAG: task 2 ex kotlinx.coroutines.JobCancellationException: Parent job is Cancelling; job=StandaloneCoroutine{Cancelling}@81a8e39
2020-01-06 09:47:58.827 7159-7159/com.mvvm.template.debug E/TAG: handler 2 false
2020-01-06 09:47:59.464 7159-7159/com.mvvm.template.debug E/TAG: task 1 finished
2020-01-06 09:47:59.499 7159-7159/com.mvvm.template.debug E/TAG: task 3 finished

моя проблема:

У меня возникла проблема, чтобы понять, почему задача 2 отменяется, когда она потомок SupervisorJob и исключение произошло с другим потомком.

Состояние документации:

Сбой или отмена ребенка не приводит к сбою задания супервизора и не влияет на других его детей. Таким образом, супервизор может реализовать собственную политику для обработки сбоев своих дочерних элементов. Я что-то упустил или что? любая помощь будет оценена.

1 Ответ

1 голос
/ 06 января 2020

Ваш ответ прямо в журнале:

task 2 ex kotlinx.coroutines.JobCancellationException: Parent job is Cancelling;
job=StandaloneCoroutine{Cancelling}@81a8e39

Посмотрите на родительскую работу: это StandaloneCoroutine, а не SupervisorJob.

Когда вы пишете

launch(myJob!!, handler) { ... }

myJob становится родителем запущенной сопрограммы, а сама подпрограмма всегда связана с заданием, которое создает функция launch для этого типа StandaloneCoroutine. Внутри этой сопрограммы вы запускаете больше сопрограмм без явного указания родителя, что означает, что их родитель является работой сопрограммы. Это не работа супервайзера, и ее отменяют.

...