何时使用Kotlin暂停关键字?

时间:2019-02-06 13:26:03

标签: kotlin kotlinx.coroutines

fun startAsyncFunc() {
  launch {
    asyncFunc1()
    asyncFunc2()
  }
}

fun asyncFunc1() { ... }
suspend fun asyncFunc2() { ... }

我可以在没有suspend的情况下完成工作,它甚至可以使测试变得更加容易(可以在不添加runBlocking的情况下进行测试。

我的问题:

  1. asyncFunc1asyncFunc2,这更好,为什么?
  2. 如果asyncFunc2更好,每当在协程中运行函数时,我是否应该始终使用suspend

5 个答案:

答案 0 :(得分:2)

asyncFunc2()关键字表示协程可以被挂起以便以后执行。

话虽如此,您应该有意识地将它们用于将被挂起的协程(例如,您的suspend进行了HTTP调用,正在等待响应以对其进行处理)

所以

  1. suspend fun用于将以某种方式延迟的功能(等待一些计算,api响应等)
  2. suspend只能从协程运行。因此,如果将其暂停,它将阻塞协程。取出runBlocking关键字,但是在协程中运行它,将具有相同的效果。但是,如果从协程外部运行此函数,它将阻塞正在其上运行的线程。

测试协程时,应始终调用https。如果不这样做,被暂停的协程可能不会完成,从而导致测试失败。

答案 1 :(得分:2)

  1. 这取决于。此时,请参见其他两个答案的组合:从协程调用任一函数的效果是相同的。但是,使用suspend关键字,函数本身可以调用其他挂起函数。使用关键字可能表明某些工作需要时间,因此可能需要暂停调用协程。
  2. 将始终从协程调用的函数不必始终具有suspend关键字。仅出于1下给出的原因才需要该关键字。另一种方法是正确的:只能从协程调用挂起函数。

答案 2 :(得分:2)

将suspend关键字用于:

  • 将以某种方式延迟的功能(等待一些计算,网络请求)

    • 该函数调用其他挂起函数时
    • 调用withContext()的函数– withContext()是来自协程库的暂停函数

经验法则是不要将功能暂停,除非您被迫

答案 3 :(得分:1)

仅在需要时声明函数suspend。我会说,如果有疑问,如果编译器不强迫您,请不要使用suspend

大多数时候,如果您有充分的理由要暂停函数,则意味着它正在做某事,可能仍然需要您使用withContext之类的暂停函数,这将迫使您声明您的函数suspend

请注意,声明函数suspend不能使调用者做的事情比不暂停函数时要多。如果有的话,就限制了函数的使用。

我相信一个无需暂停就可以挂起函数的用例是,当您真正绝对要向世界展示您的函数在计算上很繁重时,从而迫使调用者应对挂起。

答案 4 :(得分:0)

来自docs

  

暂停程序可以像常规函数一样在协程内部使用,但是它们的附加功能是它们可以依次使用其他暂停功能(如本示例中的delay)来暂停协程的执行。