问题标签 [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 投票
1 回答
2498 浏览

android - 将回调代码迁移到挂起的函数

我正在使用协程将我的 Android 代码从 Java 重构为 Kotlin,但我没有找到一种简单的方法来将基于回调的代码重写为挂起的函数。

一个基本的例子是一个返回结果的警报弹出窗口,在 Javascript 中它会是这样的:

我会在 Kotlin 中翻译成如下内容:

解析是我为此目的开发的自定义函数,这是源代码:

我使用 lambdas 和信号量快速开发了可解析函数(记住这是一个快速草稿),但我不知道是否有任何预先存在的函数(我找不到任何函数)或者可以优化或有任何缺点/问题.

谢谢。

0 投票
3 回答
22727 浏览

android - Kotlin Coroutines 的现有 3 函数回调

我有一个具体示例的一般性问题:我想在拍照时使用 Kotlin 协程魔术而不是 Android 中的回调地狱。

我如何将其转换为不那么丑陋的东西? 是否可以通过将主要流程指定为 promise-result 路径来获取具有三个左右函数的平均回调,并将其转换为 promise-chain?如果是这样,我应该/应该使用协程使其异步吗?

我喜欢 async 和 .await 的东西,这会导致

我正在尝试通过以下方式来做到这一点,但我认为我使用不CompletableDeferred正确!

0 投票
2 回答
4063 浏览

android - 为什么这个协程会阻塞 UI 线程?

弃用警报

此代码使用旧的 Coroutines Api。如果您使用的是 kotlinx-coroutines 1.1.0 或更高版本,则此代码对您没有用处

原来的问题是:

我发现我的 Android 应用程序中的这个特定代码阻止了 UI 线程:

我一直在为几个任务使用协程,它们从不阻塞 UI 线程,如可以在文档中阅读的那样:

. 协程提供了一种避免阻塞线程的方法,并用更便宜、更可控的操作来代替它:暂停协程

但奇怪的是,这段代码:

表现如预期;不阻塞,等待五秒钟然后打印结果(我需要在之后更新 UI,并且只有在sleep完成之后)

文档说可以独立使用asynclaunch不需要组合。其实async(CommonPool)应该够了。

那么这里到底发生了什么?为什么它只适用于async+launch

更新(2021 年)

[弃用警告] 此代码使用旧的 Coroutines Api。如果您使用的是 kotlinx-coroutines 1.1.0 或更高版本,请忘记这段代码

我的完整示例代码:

0 投票
2 回答
909 浏览

kotlin - Kotlin 通道满时执行一段代码

我想写一个简单的批处理器类。它有一个请求队列并等待该队列变满或经过一段时间,然后才与数据库对话。

通过通道实现这个队列非常方便——这样我们的客户端就会在它满的时候被挂起。但是我怎样才能知道通道是否已满?

当然,我可以创建一个向通道发送一些东西然后执行一些检查的方法。下一步是将其封装在从 Channel 派生的类中。仍然很脏(目前还不清楚我该如何处理onSend/ onReceive)。还有更优雅的解决方案吗?也许是开箱即用的东西?

0 投票
1 回答
1261 浏览

android - 暂停 kotlin 协程不适用于 volley

我编写了以下(测试)函数来通过 volley 和协程与 google maps api 对话。遗憾的是,当使用 suspendCoroutine 调用它时,它永远不会完成。如果我使用相同的函数,删除协程内容并实现“正常”回调,一切正常。我有点不知所措,这里有什么问题。有人能帮忙吗?

代码执行到 Log.d(LOGTAG, "AFTERAFTER"),但永远不会到达 Log.d("findNaturalLocations", "Response: " + response)

用一个简单的回调做同样的事情是完美的。

0 投票
1 回答
550 浏览

kotlin - 为什么具有无限缓冲通道的生产者不会从通道返回或返回无效数据?

从官方 Kotlin 文档中查看这个采用的示例:

如果我运行它将打印:

如您所见,这里默认使用无缓冲通道。让我们将其更改为缓冲通道:

如果我多次运行它,它将打印:

或者

要不就

我想生产者会将数据放入缓冲通道,并且for循环将从其中读取数据,直到它可以做到为止(即如果数据存在于通道中或通道未关闭,它将读取)。因此,我认为for循环应该从缓冲通道中读取所有数据,即使它已关闭。我对吗?

谁能解释一下为什么缓冲通道会导致生产者的这种奇怪行为?是虫子吗?

附言

  • kotlin-stdlib v.1.2.21(今天是最后一个版本)
  • kotlinx-coroutines-core v.0.22.2(今天是最后一个版本)
0 投票
1 回答
1575 浏览

android - 为什么这个 Kotlin 协程会冻结界面?

所以,我在“onBindViewHolder”回收器的适配器方法中运行了这段代码:

这使我的应用程序冻结了几秒钟,锁定了我的主线程。

但后来我改成这样:

为什么会这样?协程的目的是在同一个线程(UI)中使事物异步,对吗?有人可以解释一下为什么我必须在另一个协程范围内运行 UI 协程?

0 投票
4 回答
5045 浏览

kotlin - 是否可以通过超时暂停协程?

我想要的是这样的功能:

这与现有函数的作用基本相同,suspendCoroutine但如果在指定的超时时间内未调用回调或块中提供的任何内容,则协程将继续,但会出现 TimeoutException 或类似的情况。

0 投票
1 回答
372 浏览

multithreading - Is there any area where Threads should be favored over Coroutines?

I just gave a talk about Kotlin's Coroutines and the question arised if Coroutines can always replace Threads or if there also might be disadvantages.

Or the other way round: Is there any area where Coroutines should not be used for?

0 投票
1 回答
496 浏览

kotlin - runBlocking 中有两个以上等待

我在 Kotlin 中的 await 有问题,如果我只使用 2await秒,这个runBlocking块可以工作 10 秒,但是当我尝试使用 4await秒时,它可以工作 20 秒。据我了解,runBlocking 中只有两个异步线程。我怎样才能增加这个计数?