Mag*_*ian 13 android deferred kotlin kotlin-coroutines
我是协同程序的新手,我理解启动和异步,但仍然令人困惑的部分推迟.延期是什么?并且在工作和延迟之间有所不同.清除解释和示例更有帮助.提前致谢
And*_*nin 10
这样job
的对象代表了协程的执行并且与结构化并发相关,例如,您可以取消作业,并且该作业的所有子级也将被取消。
从文档:
作业是一个可以取消的事物,其生命周期在完成时达到高潮。
Deferred
是Future
Java中的一种类似物:in封装了一个操作,它将在初始化之后的某个时候完成。但也与Kotlin中的协程有关。
从文档:
递延值是一个无障碍的可取消未来-它是有结果的工作。
所以,Deferred
是一个Job
具有结果:
甲
deferred
值是一个Job
。生成器job
中的A 代表协程本身。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
}
Run Code Online (Sandbox Code Playgroud)
同样,可以async
使用现有范围构造此请求,但这是另一个问题。
从根本上讲,Deferred
是未来。这样一来,协程就可以等待另一协程产生的结果,将其自身挂起,直到准备就绪为止。调用async
是获得的一种方法,但到目前为止并不是唯一的方法Deferred
。
但是,我认为您的问题更多是关于基础知识的:何时使用launch
,何时使用async-await
。这是重要的一课:您可能不需要async。人们倾向于使用它,因为关键字async
和await
来自其他语言的熟悉,但在科特林,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)
归档时间: |
|
查看次数: |
3177 次 |
最近记录: |