首页 > 解决方案 > Coroutines Kotlin 中 Job 和 Deferred 的区别

问题描述

我是协程的新手,我理解launchasync仍然令人困惑的部分是Deferred. 是什么DeferredJob和 之间的区别Deferred。清晰的解释和示例更有帮助。提前致谢。

标签: androidkotlindeferredkotlin-coroutines

解决方案


job代表协程执行并与结构化并发相关的对象也是如此,例如,您可以取消作业,并且该作业的所有子项也将被取消。

来自文档

Job 是一个可取消的事物,其生命周期在其完成时达到高潮。

Deferred是 Java 中的某种类比Future:in 封装了一个操作,该操作将在其初始化后的某个时间点完成。但也与 Kotlin 中的协程有关。

从文档:

延迟值是一个非阻塞可取消的未来——它是一个有结果的作业。

所以,DeferredJob一个结果:

一个deferred值是一个Job。builderjob中的coroutineContextA代表协程本身。async

一个例子:

someScope.launch {
    val userJob: Deferred<User> = async(IO) { repository.getUser(id) }
    //some operations, while user is being retrieved 
    val user = userJob.await() //here coroutine will be suspended for a while, and the method `await` is available only from `Deferred` interface
    //do the job with retrieved user
}

此外,可以使用现有范围构建此async请求,但这是另一个问题的讨论。


推荐阅读