我想知道长时间运行任务的正确声明是什么。
suspend fun methodName(image: Bitmap?): String? = async {
// heavy task
}.await()
OR
fun methodName(image: Bitmap?): String? {
//heavyTask
}
在代码中使用
async{
methodName()
}.await()
第一个限制总是在后台线程上执行繁重的操作。因此,它是安全的(在某种程度上它将在后台线程上运行,因此新的Devs肯定会在可挂起的构造中使用它。)
哪种方法更好?
答案 0 :(得分:1)
Consider to use withContext()
instead of async{}.await()
in your case.
Regarding your question, IMHO, it's better to use construction like this:
suspend fun methodName(image: Bitmap?): String? = withContext(CommonPool) {
// heavy task
}
答案 1 :(得分:1)
我相信suspend
关键字是一个强烈的警告,提醒用户不要在敏感线程中使用特定功能。但这并非总是如此。如coroutines documentation中所述:
如果所讨论的呼叫的结果已经可用,图书馆可以决定继续进行而不进行暂停
如果“繁重的任务”是简单明了的。 (例如:复制文件)我个人只是在函数中添加了suspend而没有创建协程。用户完全负责该函数的调用位置。
@Throws(IOException::class)
suspend fun copy(input: File, output: File) {
//copying
}
如果“繁重的任务”由其他suspend
个函数组成。警告通常是功能参数中的couroutineContext
。并且在内部使用withContext()
之类的函数。
withContext :暂停直到完成,然后返回结果
@Throws(IOException::class)
suspend fun copyMultiple(context: CoroutineContext, pairFiles: List<Pair<File, File>>) {
pairFiles.forEach { (input, output) ->
withContext(context) {
copy(input, output)
}
}
}