android - Coroutines Kotlin 中 Job 和 Deferred 的区别
问题描述
我是协程的新手,我理解launch
但async
仍然令人困惑的部分是Deferred
. 是什么Deferred
?Job
和 之间的区别Deferred
。清晰的解释和示例更有帮助。提前致谢。
解决方案
job
代表协程执行并与结构化并发相关的对象也是如此,例如,您可以取消作业,并且该作业的所有子项也将被取消。
来自文档:
Job 是一个可取消的事物,其生命周期在其完成时达到高潮。
Deferred
是 Java 中的某种类比Future
:in 封装了一个操作,该操作将在其初始化后的某个时间点完成。但也与 Kotlin 中的协程有关。
从文档:
延迟值是一个非阻塞可取消的未来——它是一个有结果的作业。
所以,Deferred
有Job
一个结果:
一个
deferred
值是一个Job
。builderjob
中的coroutineContext
A代表协程本身。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
请求,但这是另一个问题的讨论。
推荐阅读
- sql-server - Microsoft SQL Server Management Studio 启动然后突然无法启动
- android-studio - Pub 包更新管理
- javascript - 读取通过 src 属性加载的脚本的 js 源代码
- docker - 在 docker compose path 中使用多个环境变量
- c# - 如何增加最大连接数 WCF NET TCP
- css - 两个 Bootstrap4 容器的大小调整方式不同
- json - 当模型获取和解码 json 时,来自另一个视图的 reloda 数据
- android - 为什么 startActivityForResult 中的 requestCode 可以是任何东西
- python - 如何修复“模型不包含 SBML fbc 包信息”。
- c# - 以编程方式添加 SSL 证书以开始工作 https