Ami*_*jan 11 android async-await android-asynctask kotlin-coroutines
我浏览了 Kotlin 协程,我了解它是如何工作的,但我对 Kotlin 协程和 Android Async.execute() 和 Async await 感到困惑。Kotlin 协程在后台运行并且不会在 UI 线程上阻塞,但是当我们启动 android AsyncTask(使用方法doInBackground onPostExecute和onProgressUpdate覆盖)时会发生同样的事情,它也在后台线程中进行计算并将结果发布到 UI 线程上.
Async-await 返回一个 Deffered 对象意味着结果显然会在未来返回。
任何人都可以解释这些之间有什么区别。
让我们尝试分解一下:
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>,协程将被挂起,直到结果准备好被使用。
| 归档时间: |
|
| 查看次数: |
3448 次 |
| 最近记录: |