android - 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 对象意味着结果显然会在将来返回。
任何人都可以解释这些之间有什么区别。
解决方案
让我们试着分解一下:
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>
协程时,协程会被挂起,直到结果可以被使用。
推荐阅读
- linux - 从 shell 向 CloudWatch 发送事件
- javascript - Javascript 如何从 ADODB 记录集中获取值
- r - 视网膜显示上的 RStudio 中的内联图大小和编织图大小不一致
- html - CSS HTML tfoot, tbody, thead 复杂样式
- json - 仅用字符串替换 .txt 文件中的 JSON 内容(WSO2 集成器)
- python - 如何实时监听 MongoDB 上的更改?
- java - 如何从Java中私有的另一个类访问数组?
- google-chrome - 在 docker 网络中无法访问 Chrome
- c - Recv 返回更多字节,然后消息长度为
- icecast - Icecast 介绍文件