kotlin - 何时使用 Kotlin suspend 关键字?

标签 kotlin kotlin-coroutines

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

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

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

我的问题:

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

更新

在 Kotlin 协程的最新版本中,我注意到如果一个方法不包含任何协程代码(例如 launchasync 等),编译器会提示如果内部没有调用其他挂起函数,此检查会将挂起修饰符报告为冗余。所以我认为 挂起 应该只在必须时使用。

更新2

An advice from Google

最佳答案

作为一般经验法则,只有在编译器强制时才应声明函数挂起

此规则的一个可能的异常(exception)是,如果您将此函数定义为开放方法(例如在接口(interface)中),并且您预计某些实现/覆盖需要自行调用挂起函数。

值得注意的是,在协程世界中,暂停和取消都是协作的。这意味着标记函数挂起本身不会执行任何操作。如果你没有在其中调用挂起函数,或者手动检查取消状态,那么将其标记为 挂起 可能弊大于利(因为机器有成本,但你从中得不到任何好处)在本例中就是这样)。

大多数时候,如果您有充分的理由让函数挂起,则意味着它可能正在执行某些需要您调用挂起函数的操作。例如,您可以使用 withContext 切换到特定线程池,或者可以使用 suspendCancellableCoroutine 包装基于回调的函数。无论哪种方式,调用这些函数都会强制您将 suspend 修饰符添加到您的函数中。

另请注意,声明函数挂起并不能使调用者执行比函数未挂起时更多的操作。如果有的话,那就是您限制了函数的使用。

关于kotlin - 何时使用 Kotlin suspend 关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54554753/

相关文章:

kotlin - Kotlin延迟是否在内部使用调度程序来取消阻塞调用者线程?

asynchronous - Kotlin 延续未恢复

unit-testing - 使用协程进行测试时检测到使用不同的调度程序

android - 在 kotlin 协程中实现 async-await()

android - 返回结果和 lateinit : property executions has not been initialized

design-patterns - 在Kotlin中添加元素的优雅方式

android - 将 Dispatcher.Main 与 delay() 一起使用是个好主意吗?

kotlin - (Kotlin) lateinit 属性 'VAL variable' 尚未初始化

kotlin - 协程的执行顺序?

android - Fragment 中的 View 绑定(bind)导致 KotlinNullPointerException 在生命周期范围的协程内运行