gpt4 book ai didi

android - Kotlin Coroutine,Android Async Task 和 Async await 的区别

转载 作者:行者123 更新时间:2023-12-04 23:38:05 30 4
gpt4 key购买 nike

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

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

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

最佳答案

让我们试着分解一下:

The Kotlin coroutine runs in the background


一个协程 可以在后台运行

does not block on the UI thread


先说一下什么是协程:
协程可以被认为是传递给协程构建器函数之一的代码,即 launch {}根据定义,当启动协程时,其中的挂起函数不会阻塞相应的 Thread。当他们到达时;他们“暂停”协程。
当到达暂停点时,就好像您在告诉代码“稍后再给您回电”结果可用;暂停点可以作为回调。
让我们看一个例子:
fun main() {
val job = MainScope().launch {
doSomeWork()
}

suspend fun doSomeWork() {/*expensive work goes here*/}
}
doSomeWork()到达代码将暂停协程,即暂停修饰符向协程框架指示它可以去做一些其他与协程相关的工作,然后在 doSomeWork() 时返回到这一点已经完成了。
由于此协程是使用 MainScope() 启动的它将在主 Thread 中启动.这就是为什么我说协程 可以在后台运行 Thread但并非总是如此。在这种情况下它不会,但它仍然不会阻塞 UI Thread .
另一方面, AsyncTask是(自 API 30 起已弃用)一种在后台执行任务的机制 Thread并将结果发布回 UI Thread对于 CoroutineScope.async{} 之间的区别和 CoroutineScope.launch{}我们可以查看每个的返回值。正如我在示例中所示。 launch{}返回 Job这是协程本身生命周期的表示。使用 Job你可以 cancel()join()协程;您可以控制其生命周期。正如你提到的, async{}返回 Deffered<T>这是 future 值的表示。当 await()Deffered<T> 上调用协程被挂起,直到结果可以被使用。

关于android - Kotlin Coroutine,Android Async Task 和 Async await 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56249553/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com