问题标签 [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.

0 投票
4 回答
2409 浏览

kotlin - runBlocking 中的 deferred.await() 抛出的异常即使在被捕获后也被视为未处理

这段代码:

导致此输出:

这种行为对我来说没有意义。异常被捕获和处理,但它仍然作为未处理的异常逃逸到顶层。

这种行为是否被记录和预期?它违反了我对异常处理应该如何工作的所有直觉。

我从Kotlin 论坛上的一个帖子改编了这个问题。


supervisorScope如果我们不想在协程失败时取消所有协程,则Kotlin 文档建议使用。所以我可以写

现在的输出是

这又不是我想要的行为。这里一个launched 协程因未处理的异常而失败,使其他协程的工作无效,但它们不会中断。

我认为合理的行为是在协程以不可预见(即未处理)的方式失败时传播取消。捕获异常await意味着没有任何全局错误,只是作为业务逻辑的一部分处理的本地化异常。

0 投票
2 回答
3049 浏览

kotlin - 我什么时候应该让我的正常功能暂停功能?

使用 kotlin 协程的最新稳定版本,我试图使用它来实现我的应用程序的一个功能。但是,我有点困惑。

基本上,我有一个函数可以在项目列表上做一些工作。这需要大约 700-1000 毫秒。

现在,我想要它而不阻塞主线程。所以我在启动块内启动这个函数,这样它就不会阻塞主线程。

这很好用。

但是,我尝试将该函数设置为挂起函数,以确保它永远不会阻塞主线程。实际上,在函数内部没有启动任何其他协程。还尝试在单独的协程中处理每个列表项,然后将它们全部加入以使其实际使用子协程。但是循环内的那个块使用同步方法调用。所以没有必要让它异步 - 并行。所以我最终有一个这样的挂起功能:

开头只有一个挂起修饰符,方法块用coroutineScope { }.

这还有关系吗?哪一个更好?如果它使用协程或长时间运行的函数也应该标记为挂起函数,我应该只制作函数挂起函数吗?

我很困惑。我看过最近关于协程的所有谈话,但不能清楚这一点。

谁能帮我理解这一点?

更新:

所以我最终有了这样的功能。只是为了确保永远不会在主线程上调用该函数。并且调用函数不必在任何地方都记住需要在后台线程上调用它。通过这种方式,我可以将调用函数的东西抽象化:只要按照指示做,我不在乎你想在哪里处理这些东西。只需处理并给我结果。因此,它自己负责它需要运行的位置而不是调用函数。

这是正确的方法吗?

0 投票
2 回答
10125 浏览

exception - Kotlin协程无法处理异常

我在玩协程,发现了一些非常奇怪的行为。我想在我的项目中使用suspendCoroutine(). 这是显示此问题的一段代码。

在第一种情况下,当在协程中调用挂起函数时runBlocking,来自延续的异常进入 catch 块,然后runBlocking成功完成。但是在第二种情况下,当创建新的async协程时,异常会通过 catch 块并导致整个程序崩溃。

这就是控制台上打印的内容:

任何想法为什么会发生这种情况 - 它是一个错误,还是我以错误的方式使用协程?

更新:

使用coroutineScope { ... }将缓解问题runFailingCoroutine()

0 投票
2 回答
2817 浏览

android - 当协程包含协程延迟时如何对协程进行单元测试?

当我在我的视图模型中添加协程延迟()时,其余部分代码将不会被执行。

这是我的演示代码:

我得到了断言结果:

知道如何解决这个问题吗?

0 投票
2 回答
706 浏览

kotlin - 如何使用 runBlocking 等待 CoroutineScope 的完成

我正在尝试测试一个将自己声明为CoroutineScope. 该类有一些launch在其范围内工作的方法,我必须从测试方法中断言这些工作的效果。

这是我尝试过的:

我的期望是updateValue()coroutineContext. 但事实证明这mainJob.children是空的,所以我不能等待完成launch并且require语句失败。

使这项工作的正确方法是什么?

0 投票
1 回答
1001 浏览

kotlin - Kotlin - 在迁移到 Kotlin 1.3 后,协程会导致 DefaultDispatcher 占用大量 CPU

长期使用高并发下的Kotlin协程实验版,性能一直很优秀。主要逻辑可以简化为以下代码:

但是,在我将 kotlin 更新到 1.3,并迁移到协程的正式版本之后,像这样

CPU 使用率从 2% 上升到 50%,没有抛出任何异常或错误。我注意到的唯一区别是协程不再ForkJoinPool.commonPool()像以前那样执行。相反,它们在DefaultDispatcher线程中运行,例如DefaultDispatcher-worker-30.

我的问题是:

  1. 为什么它会花费如此多的 CPU 使用率DefaultDispatcher
  2. 为什么默认使用 kotlin 1.3DefaultDispatcher代替ForkJoinPool.commonPool()
  3. 如何保持协程的行为就像 1.3 之前一样?
0 投票
2 回答
1445 浏览

swift - Kotlin 等价于 Swift 期望/承诺

我正在尝试为我的原生移动应用程序编写一些 UnitTest,但在我的 Android 测试中遇到了障碍。具体来说,我正在努力寻找 Kotlin 版本的 Swift 期望/承诺的示例。

我找到了 Kotlin Promises 的示例,但它们似乎比需要的要复杂得多......

例如,下面是我的 iOS 项目中登录 API 功能的测试:

这对我来说很简单。我有一个异步方法login,它有两个可能的完成块:successfailure;在评估之前,我需要等待其中一个完成。为此,我在调用之前创建了一个Promise,然后在两个完成块中实现Promise,并在运行我的断言之前等待Promise 完成。

现在在 Kotlin 中,我有一个类似的测试:

但我找不到 swift 的承诺的等价物..

Kotlin 中是否存在一个?testLogin如果没有,我将如何在 Kotlin中实现我的 Swift 方法的一个版本?

0 投票
8 回答
44647 浏览

kotlin - MutableLiveData:无法在协程的后台线程上调用 setValue

我正在尝试从协程触发 LiveData 的更新:

但我收到以下错误:

IllegalStateException:无法在后台线程上调用 setValue

有没有办法让它与协程一起工作?

0 投票
1 回答
1710 浏览

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

0 投票
3 回答
2203 浏览

android - 为什么必须将“Dispatchers.Main”添加到 Activity CoroutineScope 实现的根作业中?

本示例复制自协程指南,并由launch(Dispatchers.Main)协程扩展。我不明白为什么+ Dispatchers.Main需要第 4 行。如果我删除这部分,launch如果 Activity 被销毁,协程无论如何都会被取消。那么是什么原因Dispatchers.Main呢?为什么Dispatchers.IO也不添加呢?