将功能标记为挂起或使用构建器

时间:2018-07-11 06:38:43

标签: kotlin coroutine kotlin-coroutines

我从Android应用程序中的协程开始。我正在将回调重写为suspendCoroutine<> {},但我有一个困惑:什么时候应该将函数标记为suspend,什么时候应该将调用包装在某些构建器中(launchasync等)?

是否有一些最佳实践,经验法则?

1 个答案:

答案 0 :(得分:4)

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

您应该在进行的每个同步API调用中都包含withContext(myThreadPool)

所有执行I / O的Android友好API均使用异步方法,因此对于这些API,您将要编写suspend fun,但是对于CPU密集型任务(例如,解码图像),您可能需要{{ 1}}。

最后,要能够使用这两种呼叫,您必须使用withContext创建一个顶层协程。


请记住,以上内容实际上只是一个经验法则。分解代码时,很多时候您意识到需要使用launch(UI)来进行CPU密集型操作,因为该调用路径上某处有suspend fun

让我也添加一个警告,指出非常典型地滥用协程API:您几乎不需要withContext。仅在要在当前上下文中继续执行其他任务的同时真正在“后台”运行它的情况下才使用它。用简单的话来说,你永远不要写

async-await

相反,您应该写

val result = async { calculation() }.await()
相关问题