Corotines Kotlin中作业与延迟的区别

问题描述 投票:7回答:2

我是协同程序的新手,我理解启动和异步,但仍然令人困惑的部分推迟。延期是什么?并且在工作和延迟之间有所不同。清除解释和示例更有帮助。提前致谢

android kotlin deferred kotlin-coroutines
2个回答
8
投票

所以job是一个代表协程执行的对象,与structured concurrency有关,例如你可以取消一份工作,这份工作的所有孩子也将被取消。

来自docs

工作是一个可以取消的事物,其生命周期最终完成。

Deferred是Java中Future的某种类比:在封装一个将在初始化后的某个时刻完成的操作。但也与Kotlin的协同程序有关。

来自文档:

延迟值是一个非阻塞可取消的未来 - 它是一个具有结果的Job。

所以,Deferred是一个Job有一个结果:

deferred值是Job。在job建造者的coroutineContext中的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请求,但这是另一个问题的讨论。


4
投票

在基本层面上,Deferred是未来。它使一个协同程序可以等待另一个协同程序产生的结果,暂停直到它准备就绪。调用async是一种方式,但到目前为止不是唯一的方式,获得一个Deferred

但是,我认为你的问题更多的是基础知识:何时使用launch,何时使用async-await。这是一个重要的教训:你可能不需要异步。人们倾向于使用它,因为关键字asyncawait在其他语言中很常见,但在Kotlin中,async不是实现非阻塞调用的通用工具。

以下是关于如何将阻止调用转换为暂停,非阻塞调用的基本方法:

uiScope.launch {
    val ioResult = withContext(Dispatchers.IO) { blockingIOCall() }
    ... just use the result, you're on the GUI thread here.
}
© www.soinside.com 2019 - 2024. All rights reserved.