Tag: kotlinx.coroutines

什么关闭kotlinx.coroutines通道呢

使用channel.close()关闭kotlinx.coroutines频道的是什么,以及不手动关闭频道的负面影响是什么? 如果我不手动关闭一个频道会有一些不必要的处理? 会不会有某个地方的频道被引用,以防止它成为GCd? 还是关闭功能只是作为通知潜在用户不能再使用频道的一种方式而存在。 (从Kotlin论坛转贴的问题https://discuss.kotlinlang.org/t/closing-coroutine-channels/2549 )

如何在Kotlin Spek测试中组织多个协程和期望块?

我写了一个失败的Spek测试,因为我对涉及多个协程的执行顺序做了一个不正确的假设, it功能如下: given("a test") { runBlocking { print("a") } it("block 1") { runBlocking { print("b") } } runBlocking { print("c") } it("block 2") { runBlocking { print("d") } } } 我希望打印abcd ,但实际上打印。 我应该如何编写这个测试,以便它以可视的方式读取并按照预定的顺序执行?

在Kotlin协同程序中启动/连接和异步/等待之间有什么区别?

在kotlinx.coroutines库中,您可以使用launch (使用kotlinx.coroutines )或async (使用await )来启动新协程。 他们有什么区别?

在Kotlin协程被取消之后,抛不出异常抛出

使用kotlinx.coroutines lib如果在协程被取消后抛出异常,我不能捕捉到异常。 这导致应用程序崩溃。 fun foo() { val job = launch(UI) { try { Log.d("TAG", "Start coroutine") run(CommonPool) { Log.d("TAG", "Start bg task") // Intentionally make bg task running for a long time SystemClock.sleep(2000) Log.d("TAG", "Throw bg task exception") throw RuntimeException("Bg task exception") } } catch (e: Exception) { Log.e("TAG", "Handle coroutine exception", e) } } […]

Kotlin协同程序不等待完成

我有一个遗留项目,我想在联系后端时使用协程。 后端由Hybris交付的sdk处理。 它使用凌空例如,并与一些回调。 我想要的是用协程包装这些回调。 但是我遇到的问题是,协程并不等待完成,它启动协程,继续下一行,方法返回一个值,并在协程完成之后很久。 我的代码: suspend fun ServiceHelper.getList(): ListOfWishes { return suspendCancellableCoroutine { continuation -> getAllLists(object : ResponseReceiver<ListOfWishes> { override fun onResponse(response: Response<ListOfWishes>?) { continuation.resume(response?.data!!) } override fun onError(response: Response<ErrorList>?) { val throwable = Throwable(Util.getFirstErrorSafe(response?.data)) continuation.resumeWithException(throwable) } }, RequestUtils.generateUniqueRequestId(), false, null, object : OnRequestListener { override fun beforeRequest() {} override fun afterRequestBeforeResponse() {} override […]

Kotlin演员来演员沟通

一个演员可以发送一个消息与actor.send()或actor.offer()一旦我的演员从其频道收到消息,我想返回一个响应。 我如何做到这一点? 我没有看到任何明显的内置方法。

使用单元测试支持清理Kotlin中的协程

一段时间以来,我们正在与Kotlin合作,而我们目前正在关注的一件事情是使用Coroutines来处理我们想要运行异步的操作。 虽然示例的用法是清楚的,这是有效的,我有一些问题整合在一个干净的方式在我们的架构。 当看一个方法的领域为焦点的类的实现,这个想法是,它很容易阅读,有尽可能少的异步功能“噪音”。 我知道我不能有异步,没有实际使用它。 所以写这样的东西是我想要的: val data = someService.getData().await() // work with data 但是这是我想要阻止的: launch(UI) { val data val job = async(CommonPool) { data = someService.getData() } job.await() // work with data } 那么,我想配对这些领域为重点的类的实际单元测试,但我真的不能得到这个工作。 我们来看一个例子: // Some dependency doing heavy work class ApiClient { suspend fun doExpensiveOperation(): String { delay(1000) return "Expensive Result Set" } […]

为什么在Kotlin中使用方法引用来暂停函数是不可能的?

我有一个Job实例列表,我想在启动后的某个时候取消。 这看起来如下: val jobs = arrayListOf<Job>() //launch and add jobs… jobs.forEach { it.cancelAndJoin() } // cancels the jobs and waits for completion 不幸的是,这里不可能使用方法引用。 原因: cancelAndJoin是一个suspend函数,因为编译器抱怨: jobs.forEach (Job::cancelAndJoin) “错误:(30,24)Kotlin:不支持[可调参考暂停功能]” 为什么这不工作? (fyi代码在另一个协程中执行)

如何使用基于ThreadLocal和Kotlin协程的代码

一些JVM框架使用ThreadLocal来存储应用程序的调用上下文,如SLF4j MDC ,事务管理器,安全管理器等。 但是,Kotlin协同程序是在不同的线程上发送的,所以如何才能工作呢? (这个问题受GitHub问题的启发)

Kotlin协同程序:包装cassandra同步使用vs翻译异步使用

这个问题可能也适用于其他图书馆,但使用卡桑德拉作为一个具体的例子,以确保我要求一个可回答的问题: 使用Kotlin,我可以使用Cassandra的异步方法,然后使用ListenableFuture集成来包装它们, 也可以使用Cassandra的同步方法,并使用暂停方法和启动/异步来包装它们的用法。 我在猜测,更好的方法是使用库的现有异步方法,假定更容易避免死锁并且更快,但是我猜测并且对于协程是新的。 对于更熟练的协同工作者来说,这是一个显而易见的答案,还是有“依赖”的特定领域?