Kotlin Coroutine,Android Async Task 和 Async await 的区别
Posted
技术标签:
【中文标题】Kotlin Coroutine,Android Async Task 和 Async await 的区别【英文标题】:Difference between Kotlin Coroutine ,Android Async Task and Async await 【发布时间】:2019-10-08 12:18:48 【问题描述】:我了解了 Kotlin 协程,我了解它的工作原理,但我对 Kotlin 协程和 android Async.execute() 和 Async await 之间存在混淆。 Kotlin 协程在后台运行,不会阻塞 UI 线程,但是当我们启动 android AsyncTask 时会发生同样的事情(使用方法 doInBackground
onPostExecute
和 onProgressUpdate
覆盖),它也在后台进行计算线程并在 UI 线程上发布结果。
async-await 返回一个 Defered 对象意味着结果显然会在未来返回。
谁能解释一下它们之间的区别。
【问题讨论】:
基本上他们做同样的事情,只是在细节和 API 设置上有所不同。它们都异步执行任务并为您提供在未来获取结果的方法,await 只是让同一个线程等待未来的结果,本质上强制任务同步。 主要区别我看到AsyncTask
默认在SingleThreadPoolExecuter
中运行,因此默认情况下您不能并行运行多个AsyncTask
。除此之外,AsyncTask
如果处理不当,通常会留下内存泄漏.. 我的坚果壳 Kotlin 协程是一种优雅的异步调用方式,没有任何回调接口,非常类似于RXjava
..
@jackz314 如果我使用这样的异步等待 myAPIService.getWeather(location).await() 然后 myAPIService.getDetails(id).await() ,你的意思是说第一个 api 得到结果getWeather 然后 getDetails ??
是的,如果您调用await()
,那么线程将等待任务完成执行下一行,这与普通同步代码的行为相同。
他们都解决了同样的问题。后台处理。这个想法是哪一个是最好的。我个人使用协程。 Google 已经弃用了AsyncTask
。他们只是有不同的实现
【参考方案1】:
让我们试着分解一下:
Kotlin 协程在后台运行
协程CAN在后台运行
不会在 UI 线程上阻塞
我们来谈谈协程是什么:
协程可以被认为是传递给协程构建器函数之一的代码,即launch
根据定义,当启动协程时,其中的挂起函数在到达时不会阻塞相应的Thread
;他们“暂停”协程。
当达到暂停点时,就好像您在告诉代码“稍后再给您回电”结果可用时;暂停点可以作为回调。
我们来看一个例子:
fun main()
val job = MainScope().launch
doSomeWork()
suspend fun doSomeWork() /*expensive work goes here*/
当到达doSomeWork()
时,代码将暂停协程,即暂停修饰符向协程框架指示它可以去做一些其他与协程相关的工作,然后当doSomeWork()
完成时返回到这一点。
由于这个协程是使用MainScope()
启动的,它将在主Thread
中启动。这就是为什么我说协程 CAN 在后台运行 Thread
但并非总是如此。在这种情况下它不会,但它仍然不会阻止 UI Thread
。
另一方面,AsyncTask
是(自 API 30 起已弃用)一种在后台执行任务 Thread
并将结果发布回 UI 的机制 Thread
对于CoroutineScope.async
和CoroutineScope.launch
之间的区别,我们可以查看每个的返回值。正如我在示例中所示。 launch
返回一个 Job
,它表示协程本身的生命周期。使用Job
你可以cancel()
或join()
协程;您可以控制其生命周期。正如您所提到的,async
返回一个 Deffered<T>
,它表示未来值。当 await()
在 Deffered<T>
上被调用时,协程会暂停,直到结果可以被使用。
【讨论】:
以上是关于Kotlin Coroutine,Android Async Task 和 Async await 的区别的主要内容,如果未能解决你的问题,请参考以下文章
Android Kotlin之Coroutine(协程)详解
Kotlin Coroutine 源码解析 —— 协程是如何运行的
Kotlin Coroutine 源码解析 —— 协程是如何运行的
Kotlin 协程单元测试错误:线程“main @coroutine#1 @coroutine#2”中的异常 java.lang.NullPointerException