Tag: kotlinx.coroutines

Kotlin Coroutines – 启用ProGuard的ClassNotFoundException

我有一个使用Coroutines库的Kotlin编写的已发布的应用程序,主要与Retrofit2一起用于API请求。 我正在使用另一个库, Kotlin Coroutines for Retrofit ,它将Coroutines和Retrofit2联系在一起。 在我的最新版本中,为了减小APK的大小,我将minifyEnabled true设置minifyEnabled true并按照我使用的库的指示添加了ProGuard规则。 问题: Google Play控制台通知我关于以下设备的崩溃:BQ Aquaris U Plus,Samsung Galaxy Grand Neo Plus,RCA 7 Voyager。 该应用程序在大多数设备上正常工作 堆栈跟踪: java.lang.RuntimeException: at kotlinx.coroutines.experimental.DispatchTask.run (CoroutineDispatcher.kt:127) at android.os.Handler.handleCallback (Handler.java:751) at android.os.Handler.dispatchMessage (Handler.java:95) at android.os.Looper.loop (Looper.java:154) at android.app.ActivityThread.main (ActivityThread.java:6119) at java.lang.reflect.Method.invoke (Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:886) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:776) Caused by: java.util.ServiceConfigurationError: at java.util.ServiceLoader.fail […]

Kotlin并行协程

保存来自单独的协同程序的多个作业实例是可以接受的。 比方说,我想同时运行两个协程,它们是不相关的,不能在一个协程中发生,但我希望它们并行运行。 在Android中,我应该保存作业实例,这样我就可以在onDestroy方法中取消作业了。 将每项工作分别保存在清单中还是打破某种规定是可以接受的。 我知道在RX他们有订阅为什么Kotlin协同程序中没有相应的东西? val jobList = arrayListOf() fun startJob1() { jobList.add(launch { //do some work }) fun startJob1() { jobList.add(launch { //do some other unrelated work }) override fun onDestroy() { super.onDestroy() cancelAllActiveJobs(jobList) } 这种types的架构对于协程是否有意义?

使用Kotlin协程的multithreading

我正在用Kotlin Coroutines进行试验,并有如下代码: fun main(args: Array) = runBlocking { val cores = Runtime.getRuntime().availableProcessors() println(“number of cores: $cores”) val jobs = List(10) { async(CommonPool) { delay(100) println(“async #$it on thread ${Thread.currentThread().name}”) } } jobs.forEach { it.join() } } 这是我的输出: number of cores: 4 async number:0 on thread ForkJoinPool.commonPool-worker-2 async number:2 on thread ForkJoinPool.commonPool-worker-3 async number:3 on thread […]

Kotlin协程中的“+”?

这是通过 Kotlin Coroutines的显式工作取消示例代码: fun main(args: Array) = runBlocking { val job = Job() // create a job object to manage our lifecycle // now launch ten coroutines for a demo, each working for a different time val coroutines = List(10) { i -> // they are all children of our job object launch(coroutineContext + job) […]

Kotlin协程与超时

我正在写一个测试函数,它应该运行一个块或(当达到一定的超时时间)引发exception。 我在Kotlin的Coroutines试了Coroutines ,但是结束了Coroutines和CompletableFuture的混合: fun runBlockWithTimeout(maxTimeout: Long, block: () -> T ): T { val future = CompletableFuture() // runs the coroutine launch { block() } return future.get(maxTimeout, TimeUnit.MILLISECONDS) } 这有效,但我不确定这是否是解决kotlin问题的有效方法。 我也尝试了其他方法: runBlocking { withTimeout(maxTimeout) { block() } } 但这似乎不工作,只要block调用例如Thread.sleep(…) 那么CompletableFuture方法是否还有更好的方法呢? 更新1我想实现的是: 异步集成 – 测试代码(比如从RabbitMq接收数据)应该像这样测试: var rabbitResults: List = … // are filled async via RabbitListeners […]

我怎样才能用Kotlin DSL为Gradle配置Kotlin协程?

在Kotlin-DSL中使用Gradle 4.4.1,我想在我的Kotlin 1.2.20项目中配置实验Kotlin协同程序。 这certificate是非常困难的。 官方的Kotlin文档本身只提到Gradle和Groovy DSL,而不是Kotlin。 Kotlin-DSL项目有一个协程不起作用的例子 。 可能是为了一个较老的Gradle版本(该脚本中的Kotlin版本是1.1.51,本身是可疑的)。 PS:即使IntelliJ的配置Kotlin写不正确的Gradle代码。 降级唯一的选择? 附录:构建脚本在IntelliJ IDEA中非常红 。 IDE始终添加导入语句。 看来,这些徒劳的尝试是使剧本不起作用的。 我禁用了“临时添加unambiguos导入”,即使脚本保持大部分为红色,Gradle也可以执行它。 之后,IntelliJ的错误消息也没有了。

监制器内的生产者

我正在尝试为听众创建producer 。 我的代码看起来像这样 suspend fun foo() = produce{ someEvent.addListener { this.send(it) } } 但是我得到错误Suspension functions can be called only within coroutine中Suspension functions can be called only within coroutine ,这是有道理的。 我的问题是。 有没有办法使用协程来实现这个模式?

扇出/扇入结果通道

我正在生产项目,从多个协同例程中消费,并推回到resultChannel。 制片人正在关闭最后一个项目后的频道。 代码永远不会结束,因为resultChannel永远不会被关闭。 如何检测并正确完成迭代,所以hasNext()返回false ? val inputData = (0..99).map { "Input$it" } val threads = 10 val bundleProducer = produce<String>(CommonPool, threads) { inputData.forEach { item -> send(item) println("Producing: $item") } println("Producing finished") close() } val resultChannel = Channel<String>(threads) repeat(threads) { launch(CommonPool) { bundleProducer.consumeEach { println("CONSUMING $it") resultChannel.send("Result ($it)") } } } val iterator = object […]

如何实施一个有限的调用与改造阻塞客户端和协程

我有以下代码: val context = newFixedThreadPoolContext(nThreads = 10, name="myThreadPool") val total = 1_000_000 //can be other number as well val maxLimit = 1_000 return runBlocking { (0..total step maxLimit).map { async(context) { val offset = it val limit = it + maxLimit blockingHttpCall(offset, limit) } }.flatMap { it.await() }.associateBy { … }.toMutableMap() } 我想只有10个电话同时发生阻塞的API。 但是,上面的代码似乎没有按照我的预期(我认为所有的调用立即开始),或者至少我不明白,如果它。 什么是实施它的正确方法? […]

Kotlin并行协程

保存来自单独的协同程序的多个作业实例是可以接受的。 比方说,我想同时运行两个协程,它们是不相关的,不能在一个协程中发生,但我希望它们并行运行。 在Android中,我应该保存作业实例,这样我就可以在onDestroy方法中取消作业了。 将每项工作分别保存在清单中还是打破某种规定是可以接受的。 我知道在RX他们有订阅为什么Kotlin协同程序中没有相应的东西? val jobList = arrayListOf<Job>() fun startJob1() { jobList.add(launch { //do some work }) fun startJob1() { jobList.add(launch { //do some other unrelated work }) override fun onDestroy() { super.onDestroy() cancelAllActiveJobs(jobList) } 这种类型的架构对于协程是否有意义?