协同程序Kotlin中Job和Deferred之间的区别

时间:2018-11-22 09:52:50

标签: android kotlin deferred kotlin-coroutines

我是协程的新手,我了解启动和异步功能,但仍然有些困惑,因此推迟了。什么推迟了?作业和延期之间的区别。清晰的说明和示例更有用。预先感谢

2 个答案:

答案 0 :(得分:5)

因此,job是一种对象,代表协程的执行并与structured concurrency有关,例如您可以取消工作,该工作的所有子级也将被取消。

来自docs

  

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

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

摘自文档:

  

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

因此,DeferredJob,其结果为:

  

deferred的值是Jobjob的{​​{1}}构建器中的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 } 请求,但这是另一个问题的讨论。

答案 1 :(得分:3)

从根本上讲,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.
}