我想知道长时间运行的任务的正确声明是什么。

suspend fun methodName(image: Bitmap?): String? = async {
   // heavy task
}.await()

或者
fun methodName(image: Bitmap?): String? {
   //heavyTask
}

并在代码中使用
async{
   methodName()
}.await()

第一个限制总是在后台线程上执行繁重的操作。因此,它是安全的(以某种方式将其在后台线程上运行,以便新的Dev可以确保在可挂起的构造中使用它)。

哪种方法更好?

最佳答案

我相信suspend关键字对用户来说是一个强烈的警告,以防止在敏感线程中使用特定功能。但这并非总是如此。如coroutines documentation中所述:



如果说“繁重的任务”是直截了当的。 (例如:复制文件)我个人只是在函数中添加了suspend,而没有创建协程。用户完全负责该函数的调用位置。

@Throws(IOException::class)
suspend fun copy(input: File, output: File) {
   //copying
}

如果“繁重的任务”是由其他suspend函数组成的。警告通常是功能参数中的couroutineContext。并且在内部使用 withContext() 之类的函数。


@Throws(IOException::class)
suspend fun copyMultiple(context: CoroutineContext, pairFiles: List<Pair<File, File>>) {
    pairFiles.forEach { (input, output) ->
        withContext(context) {
            copy(input, output)
        }
    }
}

10-04 20:06