【问题标题】:Why should I define background task as suspend function为什么要将后台任务定义为挂起功能
【发布时间】:2019-07-19 03:48:24
【问题描述】:

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

【问题讨论】:

    标签: android kotlin kotlin-coroutines coroutine background-task


    【解决方案1】:

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

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

    这里我们调用suspend fun withContext() 并将suspend 修饰符添加到backTask 函数。如果我们不这样做,编译器将给出一个错误Suspend function withContext 应该只从协程或另一个挂起函数中调用。在这种情况下,使用协程我们可以调用backTask 函数而不阻塞主线程:

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

    注意:GlobalScope.launchis not recommended to use

    【讨论】:

    • 如果您的工作在设计上是不可取消的,那么 GlobalScope 是完全可以的。虽然你可能不应该想展示它的祝酒词。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      • 2011-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-27
      相关资源
      最近更新 更多