我从Android应用程序中的协程开始。我正在将回调重写为suspendCoroutine<> {}
,但我有一个困惑:什么时候应该将函数标记为suspend
,什么时候应该将调用包装在某些构建器中(launch
, async
等)?
是否有一些最佳实践,经验法则?
答案 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()