问题标签 [kotlin-coroutines]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
kotlin - runBlocking 中的 deferred.await() 抛出的异常即使在被捕获后也被视为未处理
这段代码:
导致此输出:
这种行为对我来说没有意义。异常被捕获和处理,但它仍然作为未处理的异常逃逸到顶层。
这种行为是否被记录和预期?它违反了我对异常处理应该如何工作的所有直觉。
我从Kotlin 论坛上的一个帖子改编了这个问题。
supervisorScope
如果我们不想在协程失败时取消所有协程,则Kotlin 文档建议使用。所以我可以写
现在的输出是
这又不是我想要的行为。这里一个launch
ed 协程因未处理的异常而失败,使其他协程的工作无效,但它们不会中断。
我认为合理的行为是在协程以不可预见(即未处理)的方式失败时传播取消。捕获异常await
意味着没有任何全局错误,只是作为业务逻辑的一部分处理的本地化异常。
kotlin - 我什么时候应该让我的正常功能暂停功能?
使用 kotlin 协程的最新稳定版本,我试图使用它来实现我的应用程序的一个功能。但是,我有点困惑。
基本上,我有一个函数可以在项目列表上做一些工作。这需要大约 700-1000 毫秒。
现在,我想要它而不阻塞主线程。所以我在启动块内启动这个函数,这样它就不会阻塞主线程。
这很好用。
但是,我尝试将该函数设置为挂起函数,以确保它永远不会阻塞主线程。实际上,在函数内部没有启动任何其他协程。还尝试在单独的协程中处理每个列表项,然后将它们全部加入以使其实际使用子协程。但是循环内的那个块使用同步方法调用。所以没有必要让它异步 - 并行。所以我最终有一个这样的挂起功能:
开头只有一个挂起修饰符,方法块用coroutineScope { }
.
这还有关系吗?哪一个更好?如果它使用协程或长时间运行的函数也应该标记为挂起函数,我应该只制作函数挂起函数吗?
我很困惑。我看过最近关于协程的所有谈话,但不能清楚这一点。
谁能帮我理解这一点?
更新:
所以我最终有了这样的功能。只是为了确保永远不会在主线程上调用该函数。并且调用函数不必在任何地方都记住需要在后台线程上调用它。通过这种方式,我可以将调用函数的东西抽象化:只要按照指示做,我不在乎你想在哪里处理这些东西。只需处理并给我结果。因此,它自己负责它需要运行的位置而不是调用函数。
这是正确的方法吗?
exception - Kotlin协程无法处理异常
我在玩协程,发现了一些非常奇怪的行为。我想在我的项目中使用suspendCoroutine()
. 这是显示此问题的一段代码。
在第一种情况下,当在协程中调用挂起函数时runBlocking
,来自延续的异常进入 catch 块,然后runBlocking
成功完成。但是在第二种情况下,当创建新的async
协程时,异常会通过 catch 块并导致整个程序崩溃。
这就是控制台上打印的内容:
任何想法为什么会发生这种情况 - 它是一个错误,还是我以错误的方式使用协程?
更新:
使用coroutineScope { ... }
将缓解问题runFailingCoroutine()
android - 当协程包含协程延迟时如何对协程进行单元测试?
当我在我的视图模型中添加协程延迟()时,其余部分代码将不会被执行。
这是我的演示代码:
我得到了断言结果:
知道如何解决这个问题吗?
kotlin - 如何使用 runBlocking 等待 CoroutineScope 的完成
我正在尝试测试一个将自己声明为CoroutineScope
. 该类有一些launch
在其范围内工作的方法,我必须从测试方法中断言这些工作的效果。
这是我尝试过的:
我的期望是updateValue()
在coroutineContext
. 但事实证明这mainJob.children
是空的,所以我不能等待完成launch
并且require
语句失败。
使这项工作的正确方法是什么?
kotlin - Kotlin - 在迁移到 Kotlin 1.3 后,协程会导致 DefaultDispatcher 占用大量 CPU
长期使用高并发下的Kotlin协程实验版,性能一直很优秀。主要逻辑可以简化为以下代码:
但是,在我将 kotlin 更新到 1.3,并迁移到协程的正式版本之后,像这样
CPU 使用率从 2% 上升到 50%,没有抛出任何异常或错误。我注意到的唯一区别是协程不再ForkJoinPool.commonPool()
像以前那样执行。相反,它们在DefaultDispatcher
线程中运行,例如DefaultDispatcher-worker-30
.
我的问题是:
- 为什么它会花费如此多的 CPU 使用率
DefaultDispatcher
? - 为什么默认使用 kotlin 1.3
DefaultDispatcher
代替ForkJoinPool.commonPool()
? - 如何保持协程的行为就像 1.3 之前一样?
swift - Kotlin 等价于 Swift 期望/承诺
我正在尝试为我的原生移动应用程序编写一些 UnitTest,但在我的 Android 测试中遇到了障碍。具体来说,我正在努力寻找 Kotlin 版本的 Swift 期望/承诺的示例。
我找到了 Kotlin Promises 的示例,但它们似乎比需要的要复杂得多......
例如,下面是我的 iOS 项目中登录 API 功能的测试:
这对我来说很简单。我有一个异步方法login
,它有两个可能的完成块:success
和failure
;在评估之前,我需要等待其中一个完成。为此,我在调用之前创建了一个Promise,然后在两个完成块中实现Promise,并在运行我的断言之前等待Promise 完成。
现在在 Kotlin 中,我有一个类似的测试:
但我找不到 swift 的承诺的等价物..
Kotlin 中是否存在一个?testLogin
如果没有,我将如何在 Kotlin中实现我的 Swift 方法的一个版本?
kotlin - MutableLiveData:无法在协程的后台线程上调用 setValue
我正在尝试从协程触发 LiveData 的更新:
但我收到以下错误:
IllegalStateException:无法在后台线程上调用 setValue
有没有办法让它与协程一起工作?
android - 将 Android Studio 项目更新到 Kotlin 1.3
我正在尝试使用 Kotlin Coroutine 的runBlocking
功能,但我收到此方法是在 Kotlin 1.3 中引入的错误。
所以,我尝试更新我的 Android Studio 项目以使用 Kotlin1.3.0
但是,当我这样做时,我得到了错误:"org.jetbrains.kotlin:kotlin-stdlib-jre7:1.3.0" is unresolved
...
将我的 Android Studio 项目更新为使用 Kotlin 1.3 的推荐方法是什么?还是有另一种runBlocking
与 Kotlin 兼容的方法1.2.51
?
android - 为什么必须将“Dispatchers.Main”添加到 Activity CoroutineScope 实现的根作业中?
本示例复制自协程指南,并由launch(Dispatchers.Main)
协程扩展。我不明白为什么+ Dispatchers.Main
需要第 4 行。如果我删除这部分,launch
如果 Activity 被销毁,协程无论如何都会被取消。那么是什么原因Dispatchers.Main
呢?为什么Dispatchers.IO
也不添加呢?