Corotines Kotlin中作业与延迟的区别

Mag*_*ian 13 android deferred kotlin kotlin-coroutines

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

And*_*nin 10

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

文档

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

DeferredFutureJava中的一种类似物:in封装了一个操作,它将在初始化之后的某个时候完成。但也与Kotlin中的协程有关。

从文档:

递延值是一个无障碍的可取消未来-它是有结果的工作。

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

deferred值是一个Job。生成器job中的A 代表协程本身。coroutineContextasync

一个例子:

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
}
Run Code Online (Sandbox Code Playgroud)

同样,可以async使用现有范围构造此请求,但这是另一个问题。


Mar*_*nik 6

从根本上讲,Deferred是未来。这样一来,协程就可以等待另一协程产生的结果,将其自身挂起,直到准备就绪为止。调用async是获得的一种方法,但到目前为止并不是唯一的方法Deferred

但是,我认为您的问题更多是关于基础知识的:何时使用launch,何时使用async-await。这是重要的一课:您可能不需要async。人们倾向于使用它,因为关键字asyncawait来自其他语言的熟悉,但在科特林,async不是通用的工具来实现非阻塞调用。

这是有关如何将阻塞呼叫转换为挂起的非阻塞呼叫的基本方法:

uiScope.launch {
    val ioResult = withContext(Dispatchers.IO) { blockingIOCall() }
    ... just use the result, you're on the GUI thread here.
}
Run Code Online (Sandbox Code Playgroud)