在Kotlin协同程序中启动/连接和异步/等待之间有什么区别?
在kotlinx.coroutines
库中,您可以使用launch
(使用kotlinx.coroutines
)或async
(使用await
)来启动新协程。 他们有什么区别?
-
launch
是用来发射和忘记协同程序 。 这就像开始一个新的线程。 如果launch
的代码以异常终止,那么它将被视为线程中未捕获的异常 – 通常在后端JVM应用程序中将其打印到stderr,并使Android应用程序崩溃。join
用于等待启动的协程完成,并不传播其异常。 但是,一个崩溃的子协程也取消了它的父类,也有相应的例外情况。 -
async
用于启动计算一些结果的协程 。 结果由Deferred
实例表示,您必须使用await
。async
代码中的未捕获异常存储在生成的Deferred
内部,不会在其他任何地方传递,除非进行处理,否则它将被自动丢弃。 你不能忘记你开始使用异步的协程 。