簡體   English   中英

RxScala訂閱多觀察者只是向第一個發出事件

[英]RxScala subscribe with multi Observer just emit event to first one

我試圖用多Observer訂閱一個ObservableonNext發生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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM