我正在研究协同例程的概念以及它在kotlin中的用法和实现。我在谷歌上搜索并阅读了一些答案,因为它在架构和性能方面与线程有何不同。这里解释得很好,Differencebetweena"coroutine"anda"thread"?公平地说,协同程序很棒,没有内存开销,性能很好,没有死锁,竞争条件等,并且易于使用。现在,这里有几件事情,我很困惑,并希望在同一方面更清楚-什么时候应该在Android中使用协程和线程?还是应该只使用协同程序?如果,我只是坚持使用协同程序,那么它将如何利用CPU内核,因为它在单线程上运行。协同例程非常好用,但它如何利用多核来提高性能。
我正在从onCreate(...)调用挂起函数overridefunonCreate(savedInstanceState:Bundle?){......callGetApi()}而挂起的功能是:-suspendfuncallGetApi(){....}但出现了错误暂停函数“callGetApi”只能从协程或其他暂停函数中调用 最佳答案 Suspendfunctionshouldbecalledonlyfromacoroutine.这意味着调用suspend函数需要使用coroutinebuilder,例如launch、async或
我正在从onCreate(...)调用挂起函数overridefunonCreate(savedInstanceState:Bundle?){......callGetApi()}而挂起的功能是:-suspendfuncallGetApi(){....}但出现了错误暂停函数“callGetApi”只能从协程或其他暂停函数中调用 最佳答案 Suspendfunctionshouldbecalledonlyfromacoroutine.这意味着调用suspend函数需要使用coroutinebuilder,例如launch、async或
协程async返回Deferred还有延迟执行的例子和await的用法。但是,我们怎么能等待Deffered中的任何一个?要完成的实例?简而言之//whatstheequivalentofCompletableFuture.anyOf(...)?//isthishowwedoit?ifsohowcostlyisthis?select{deffered1.onAwait{}deffered2.onAwait{}} 最佳答案 可能不是最安全的做事方式,但这样的事情应该可行:inlinesuspendfunIterable>.awaitA
协程async返回Deferred还有延迟执行的例子和await的用法。但是,我们怎么能等待Deffered中的任何一个?要完成的实例?简而言之//whatstheequivalentofCompletableFuture.anyOf(...)?//isthishowwedoit?ifsohowcostlyisthis?select{deffered1.onAwait{}deffered2.onAwait{}} 最佳答案 可能不是最安全的做事方式,但这样的事情应该可行:inlinesuspendfunIterable>.awaitA
我是Kotlin协程的新手,但我没有弄清楚的一件事是,协程在进行网络调用时如何知道何时让步给其他人。如果我理解正确的话,协程是抢占式工作的,这意味着当它需要执行一些耗时的任务(通常是I/O操作)时,它知道何时让步给其他协程。例如,假设我们想要绘制一些UI来显示来自远程服务器的数据,并且我们只有一个线程来调度我们的协程。我们可以启动一个协程来调用RESTAPI来获取数据,同时让另一个协程绘制UI的其余部分,这些UI不依赖于数据。但是,由于我们只有一个线程,因此一次只能运行一个协程。除非用于获取数据的协程在等待数据到达时抢先让步,否则这两个协程将按顺序执行。据我所知,Kotlin的协程实现
我是Kotlin协程的新手,但我没有弄清楚的一件事是,协程在进行网络调用时如何知道何时让步给其他人。如果我理解正确的话,协程是抢占式工作的,这意味着当它需要执行一些耗时的任务(通常是I/O操作)时,它知道何时让步给其他协程。例如,假设我们想要绘制一些UI来显示来自远程服务器的数据,并且我们只有一个线程来调度我们的协程。我们可以启动一个协程来调用RESTAPI来获取数据,同时让另一个协程绘制UI的其余部分,这些UI不依赖于数据。但是,由于我们只有一个线程,因此一次只能运行一个协程。除非用于获取数据的协程在等待数据到达时抢先让步,否则这两个协程将按顺序执行。据我所知,Kotlin的协程实现
Kotlin协程可以在生产中使用,它们的实验状态意味着什么? 最佳答案 更新:从Kotlin1.3开始,Kotlin协程不再是实验性的。Kotlin协程可以而且应该在生产环境中使用。这是在Kotlin1.1中正式发布它们的主要原因。在发布它们后,JetBrains团队promise在次要版本中随着它们的发展而引入的任何更改保持向后兼容性,同时允许人们在复杂的生产应用程序中安全地试用它们。简而言之,“实验性”和“普通”功能的区别在于,对于普通的Kotlin功能,新东西不能在次要更新中添加,因为有“完全兼容”的保证,而对于实验性功能,新
Kotlin协程可以在生产中使用,它们的实验状态意味着什么? 最佳答案 更新:从Kotlin1.3开始,Kotlin协程不再是实验性的。Kotlin协程可以而且应该在生产环境中使用。这是在Kotlin1.1中正式发布它们的主要原因。在发布它们后,JetBrains团队promise在次要版本中随着它们的发展而引入的任何更改保持向后兼容性,同时允许人们在复杂的生产应用程序中安全地试用它们。简而言之,“实验性”和“普通”功能的区别在于,对于普通的Kotlin功能,新东西不能在次要更新中添加,因为有“完全兼容”的保证,而对于实验性功能,新
在kotlinx.coroutines库中,您可以使用launch(使用join)或async启动新的协程>(使用await)。它们之间有什么区别? 最佳答案 launch用于触发并忘记协程。这就像开始一个新线程。如果launch中的代码以异常终止,那么它会被视为线程中的uncaught异常——通常在后端JVM应用程序中打印到stderr并导致Android应用程序崩溃。join用于等待启动的协程完成,并且不会传播其异常。然而,一个崩溃的child协程也会取消它的父协程,并产生相应的异常。async用于启动一个计算某些结果的协程。结