Почему я должен определить фоновую задачу как функцию приостановки - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть фоновая задача в функции, которая возвращает значение.Я использую Kotlin сопрограммы .
Я могу сделать это так:

fun backTask(): Int {
   // Might take a few seconds
   return 10
}
GlobalScope.launch(Dispatcher.Main){
   val num = withContext(Dispatcher.IO) { backTask() }
   toast("Number: $num")
}

Так что это работает.Что именно заставляет меня определить мою функцию фоновой задачи, а suspend function

Ответы [ 2 ]

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

Если вы попытаетесь использовать эту функцию приостановки где-либо еще, это заставит вас использовать сопрограмму.Это означает отсутствие случайных блокировок в главном потоке :) -

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

Вы должны определить свою функцию с модификатором suspend, если вы вызываете другую функцию suspend оттуда.Например, рассмотрим следующий случай:

suspend fun backTask(): Int = withContext(Dispatchers.IO) {
   // Might take a few seconds, runs in background thread.
   10
}

Здесь мы вызываем suspend fun withContext() и добавляем модификатор suspend к функции backTask.Если мы этого не сделаем, компилятор выдаст ошибку Функция приостановки withContext должна вызываться только из сопрограммы или другой функции приостановки .В этом случае, используя сопрограмму, мы можем вызвать функцию backTask без блокировки основного потока:

GlobalScope.launch(Dispatcher.Main) {
   val num = backTask() // not blocking the Main Thread
   toast("Number: $num")
}

Примечание: GlobalScope.launch не рекомендуется использовать .

...