0

ループ内で発生したマルチ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~
...

2 番目のサブスクライブを受信できないのはなぜですか? ありがとう

4

1 に答える 1

1

コードの問題は、あなたObservableが同期していることです。これは、最初の処理が終了subscribeするまで 2 番目の処理が実行されないことを意味します。subscribeそして、あなたObservableは決して完成しないので、2番目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)

于 2016-03-21T17:25:49.587 に答える