![](/img/trans.png)
[英]Efficient way to concatenate hundreds of RxScala Observables (each with millions of events to emit)?
[英]RxScala subscribe with multi Observer just emit event to first one
我試圖用多Observer
訂閱一個Observable
其onNext
發生loop.It內似乎並不適用於所有觀測工作。
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~
...
為什么第二個人不能收到訂閱? 謝謝
您代碼中的問題是您的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)
類的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.