为什么要将后台任务定义为挂起函数
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.
如果您尝试在其他任何地方使用该挂起函数,它会强制您使用协程。这意味着主线程不会意外阻塞 :) –
我在函数中有一个后台任务,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.
如果您尝试在其他任何地方使用该挂起函数,它会强制您使用协程。这意味着主线程不会意外阻塞 :) –