【问题标题】:Rxjava with kotlin coroutines带有 kotlin 协程的 Rxjava
【发布时间】:2019-11-28 01:17:56
【问题描述】:

我需要从 rxkotlin 链启动协程,但我不确定这是对还是错,要从 rx 链启动协程,我使用 runblocking 启动挂起方法
示例

Single.just(someOperation())
   .map{
     someMethod(it)
   }
  .flatMap{
    startCoroutines(suspend { someOpeartions() } ) // i will be starting the coroutines here
  }

协程

fun startCoroutines(suspendingObj : suspend () -> Any){
  runBlocking(newFixedThreadPoolContext(1,"Thread")){
       suspendingObj.invoke()
  }
}

上面的代码是正确的方法还是有其他方法可以实现? 谁能帮我解决这个问题

【问题讨论】:

  • 如果协程已经在链中,为什么还需要协程?我想它应该是 rx 或协程。
  • @TentenPonce 这是错误的做法,如果是这样,为什么?
  • rx 已经是异步的了,为什么还要在里面使用协程呢?如果您的目标是更改线程,则 rx .observeOn() 已经支持它。您可以不暂停,而是将其设置为 rx 并将其添加到您当前的链中。
  • 阻塞几乎从来都不是一个好的选择,Rx or no Rx。 There exist 可以连接这两种方法的转换器和构建器。例如rxSingle.

标签: android kotlin kotlin-android-extensions kotlin-coroutines


【解决方案1】:

这个代码块根本上是错误的。

  1. 在您的情况下,确实没有必要使用 Coroutines,因为您可以轻松地将 flatMap 之前的 Rx 线程更改为 observeOn 并传递您想要的任何 Scheduler(如 IO)。
  2. Kotlin 协程旨在避免Threads,因为创建Threads 是一项非常昂贵的操作。并且您的函数startCoroutines 为每个没有意义的操作创建一个新线程,并且可能会导致overflow。你可以在这里阅读更多信息:Difference between a "coroutine" and a "thread"?
  3. 在决定使用runBlocking 之前,您应该始终尝试找到更好的系统设计。阻塞线程绝不是一个好主意。

【讨论】:

    猜你喜欢
    • 2018-07-19
    • 2018-05-18
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 2019-04-29
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多