方法声明kotlin async {}

时间:2018-06-19 10:26:10

标签: android multithreading kotlin coroutine kotlin-android-extensions

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

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

OR

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

在代码中使用

async{
   methodName()
}.await()

第一个限制总是在后台线程上执行繁重的操作。因此,它是安全的(在某种程度上它将在后台线程上运行,因此新的Devs肯定会在可挂起的构造中使用它。)

哪种方法更好?

2 个答案:

答案 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)
        }
    }
}