我尝试使用多个Observer
订阅Observable
,onNext
在循环中发生。它似乎不适用于每个观察者。
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~
...
为什么第二个人无法接收订阅?感谢
答案 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)
。