Работа сопрограмм никогда не завершается - PullRequest
0 голосов
/ 18 февраля 2019

Учитывая этот фрагмент кода


fun main() {
    val job = Job()
    val scope = GlobalScope + job

    scope.launch {
        println("working!")
        delay(1000L)is ms)
        println("done!")
        // how do i finish the job originally associated with this scope?
    }


    runBlocking {
        job.join()
        println("job done")
    }
}

У меня есть пользовательская область сопрограмм для моего приложения, и я связываю работу с этой областью вот так, потому что я хочу, чтобы все новые сопрограммы, которыесозданный из этой области, чтобы быть детьми этой работы, если я отменяю ее, я хочу, чтобы все в ней было отменено.

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

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Основная работа работает только как родительская и никогда не завершится.Но вы можете подождать, пока все дети завершат:

runBlocking {
    job.children.forEach { it.join() }
    println("job done")
}

В качестве альтернативы вам следует воспользоваться решением Юджина и вызвать метод join Job, который вы только что начали, вместо основной работы.

0 голосов
/ 18 февраля 2019

Существует несколько функций, ожидающих завершения объекта Job() и отменяющих его.Вы можете выбрать одну из списка

job.cancel()
job.join()
job.cancelAndJoin()

Только первая функция не является функцией suspend, поэтому вы можете вызывать ее из любой другой функции, не обязательно suspend функции

Есть лучший способ - функция launch{..} уже возвращает объект Job из вызова.Вы можете упростить код, сказав

val job = GlobalScope.launch { .. }

, что Job объект будет автоматически завершен, когда блок запуска закончится или завершится неудачно с исключением

...