为什么要将后台任务定义为挂起函数

Why should I define background task as suspend function

我在函数中有一个后台任务,returns 一个值。我使用 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

如果您从那里调用另一个 suspend 函数,您应该使用 suspend 修饰符定义您的函数。例如考虑以下情况:

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

这里我们调用了suspend fun withContext()并且给backTask函数添加了suspend修饰符。如果我们不这样做,编译器将给出错误 Suspend function withContext should be called only from a coroutine or another suspend function。在那种情况下,我们可以使用协程调用 backTask 函数而不阻塞主线程:

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

注:GlobalScope.launch is not recommended to use.

如果您尝试在其他任何地方使用该挂起函数,它会强制您使用协程。这意味着主线程不会意外阻塞 :) –