首页 > 解决方案 > Kotlin Coroutine,Android Async Task 和 Async await 的区别

问题描述

我经历了 Kotlin 协程,我了解它是如何工作的,但我对 Kotlin 协程 & Android Async.execute() & Async await 感到困惑。Kotlin 协程在后台运行,不会阻塞在 UI 线程上,但是当我们启动 android AsyncTask(使用方法doInBackground onPostExecute并被onProgressUpdate覆盖)时也会发生同样的事情,它还在后台线程中进行计算并将结果发布到 UI 线程上.

Async-await 返回一个 Defered 对象意味着结果显然会在将来返回。

任何人都可以解释这些之间有什么区别。

标签: androidandroid-asynctaskasync-awaitkotlin-coroutines

解决方案


让我们试着分解一下:

Kotlin 协程在后台运行

一个协程可以在后台运行

不会阻塞 UI 线程

先说一下什么是协程:

协程可以被认为是传递给协程构建器函数之一的代码,即launch {}

根据定义,当启动协程时,其中的挂起函数在到达时不会阻塞相应的函数Thread;他们“暂停”协程。

当到达暂停点时,就好像您在告诉代码“稍后再给您回电”结果可用;暂停点可以作为回调。

让我们看一个例子:

fun main() {
 val job = MainScope().launch {
  doSomeWork()
}

suspend fun doSomeWork() {/*expensive work goes here*/}
}

doSomeWork()到达时,代码将暂停协程,即挂起修饰符向协程框架指示它可以去做一些其他与协程相关的工作,然后在doSomeWork()完成时返回到这一点。

由于这个协程是使用MainScope()它启动的,它将在 main 中启动Thread。这就是为什么我说协程可以在后台运行,Thread并不总是这样。在这种情况下它不会,但它仍然不会阻塞 UI Thread

另一方面,AsyncTask它是(自 API 30 起已弃用)一种在后台执行任务Thread并将结果发布回 UI的机制Thread

对于 和 之间的区别CoroutineScope.async{}CoroutineScope.launch{}我们可以查看每个的返回值。正如我在示例中所示。launch{}返回 a Job,它表示协程本身的生命周期。使用Job你可以cancel()join()协程;您可以控制其生命周期。正如您所提到的,async{}返回 aDeffered<T>表示未来值。当await()调用Deffered<T>协程时,协程会被挂起,直到结果可以被使用。


推荐阅读