Kotlin Coroutine、Android Async Task 和 Async await 的区别

Ami*_*jan 11 android async-await android-asynctask kotlin-coroutines

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

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

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

Emm*_*uel 4

让我们尝试分解一下:

Kotlin 协程在后台运行

协程可以在后台运行

不会阻塞 UI 线程

我们先来说说什么是协程:

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

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

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

让我们看一个例子:

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

suspend fun doSomeWork() {/*expensive work goes here*/}
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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