代码之家  ›  专栏  ›  技术社区  ›  Pitel

标记函数挂起或使用生成器

  •  3
  • Pitel  · 技术社区  · 7 年前

    我从android应用程序中的协作开始。我正在重写回拨 suspendCoroutine<> {} 我有一个难题:什么时候我应该把函数标记为 suspend ,我应该什么时候在某个生成器中结束调用( launch 我是说, async 等等)?

    有什么最佳实践,经验法则,或者别的什么吗?

    1 回复  |  直到 6 年前
        1
  •  4
  •   Marko Topolnik    7 年前

    你应该写一个 suspend fun 对于您当前正在进行的每个异步、基于回调的API调用。

    你应该收起 withContext(myThreadPool) 您正在进行的每个同步api调用。

    所有做I/O的Android友好API都使用异步方法,因此对于这些,您将编写 暂停娱乐 但是对于CPU密集型任务(例如解码图像),您可能需要 withContext 是的。

    最后,为了能够使用这两种调用,必须创建 launch(UI) 是的。


    记住,以上只是一个经验法则。当你考虑你的代码时,很多时候你意识到你需要,例如 暂停娱乐 进行CPU密集型操作,因为 有上下文 在呼叫路径的某个地方。

    我还要对协同程序api的一个非常典型的误用添加一个警告:您几乎不需要 async-await 是的。当你继续在当前上下文中执行其他任务时,只在你想真正在“后台”运行它的情况下使用它。简单地说,你不应该写

    val result = async { calculation() }.await()
    

    相反,你应该写

    val result = withContext(myThreadPool) { calculation() }