RxScala使用多个Observer订阅只是向第一个发出事件

时间:2016-03-21 00:12:25

标签: scala rx-java observable rx-scala

我尝试使用多个Observer订阅ObservableonNext在循环中发生。它似乎不适用于每个观察者。

import rx.lang.scala.Observable

object SubscribeMultiEvent extends App{
  val obv = Observable.apply[String]{ s =>
    def printForever: Unit = {
      s.onNext("hi~")
      Thread.sleep(1000)
      printForever
    }
    printForever
  }

  obv.subscribe(s => println(s"first observer - $s"))
  obv.subscribe(s => println(s"second observer - $s"))

  Thread.currentThread().join()
}

仅针对第一个观察者的响应

first observer - hi~
first observer - hi~
...

为什么第二个人无法接收订阅?感谢

1 个答案:

答案 0 :(得分:1)

您的代码中的问题是Observable是同步的。这意味着第二个subscribe会在第一个subscribe完成之前一直运行。由于您的Observable永远不会完成,因此第二个subscribe无法运行。

要解决此问题,您需要使Observable异步。您可以使用subscribeOn在另一个线程中运行。如,

import rx.lang.scala.Observable
import rx.lang.scala.schedulers.NewThreadScheduler

object SubscribeMultiEvent extends App{
  val obv = Observable.apply[String]{ s =>
    def printForever: Unit = {
      s.onNext("hi~")
      Thread.sleep(1000)
      printForever
    }
    printForever
  }.subscribeOn(NewThreadScheduler())

  obv.subscribe(s => println(s"first observer - $s"))
  obv.subscribe(s => println(s"second observer - $s"))

  Thread.sleep(60000)
}

Thread.sleep(60000)最后很重要。默认情况下,RxJava的线程是守护进程,如果主线程完成,因为没有更多的非守护进程线程,JVM将退出。要防止主线程停止,您需要添加Thread.sleep(60000)

之类的内容