我想知道长时间运行的任务的正确声明是什么。
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)
}
}
}