Job.Cancel() не отменяет сопрограммуAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Job.Cancel() не отменяет сопрограмму

Сообщение Anonymous »

У меня есть такой небольшой тест. предположим, что функция getAll() получает данные из API. Я использую функцию delay(3000) для имитации задержки.

Код: Выделить всё

class Repository {
var job: Job? = null
fun getAll() {
job = CoroutineScope(Dispatchers.IO).launch {
try {
delay(3000)
println("getAll oke")
} catch (e: Exception) {
println("CancellationException")
}
}
}

fun cancel() {
job?.cancel()
println("cancel")
}
}

fun main() {
runBlocking {
val api = Repository()
launch {
api.getAll()
}
delay(1000)
api.cancel()
delay(5000)
println("END")
}
}
В приведенном выше абзаце это будет распечатано следующим образом:

Код: Выделить всё

cancel
CancellationException
Если я заменю delay(3000) на Thread.sleep(3000).

Код: Выделить всё

cancel
getAll oke
END
Проблема: если я заменю delay(3000) на Thread.sleep(3000). Это не работает. Я могу объяснить. Причина в том, что delay() знает, была ли сопрограмма вызвана cancel() или нет. Если она была отменена, она автоматически отменит эту сопрограмму.
Но Thread.sleep() этого не делает. Таким образом, даже несмотря на то, что был вызван cancel(). операторы в сопрограмме все равно будут выполняться.
Мой вопрос. Если функция getAll() выполняет вызов API с использованием модификации, номер... будет ли он отменен при вызове отмены?

Подробнее здесь: https://stackoverflow.com/questions/792 ... -coroutine
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»