Как проверить Kotlin coroutine job.isActive в вызывающем методе - PullRequest
1 голос
/ 09 июля 2020

Я пытаюсь использовать Kotlin сопрограмму вместо устаревшего Java потока для выполнения фоновых действий:

Я узнал из этой ссылки , и она отлично работает

val job = launch {
    for(file in files) {
        ensureActive() //will throw cancelled exception to interrupt the execution
        readFile(file)
    }
}

Но в моем случае у меня очень сложная вызывающая функция readFile (), как я могу проверить, активно ли задание внутри этой функции?

val job = launch {
    for(file in files) {
        ensureActive() //will throw cancelled exception to interrupt the execution
        complexFunOfReadingFile(file) //may process each line of the file
    }
}

Я не хочу копировать имплементация функции внутри этой области сопрограммы или передать экземпляр задания в качестве параметра в эту функцию. Как официально разрешить этот случай?

Большое спасибо.

1 Ответ

2 голосов
/ 09 июля 2020

Создайте complexFunOfReadingFile() функцию suspend и поместите в нее вызовы periodi c yield() или ensureActive().

Пример:

suspend fun foo(file: File) {
    file.useLines { lineSequence ->
        for (line in lineSequence) {
            yield() // or coroutineContext.ensureActive()            
            println(line)
        }
    }
}
...