RxJava在多个用户之间共享可观测的排放

我有以下问题:

我有一个观察者正在做一些工作,但是其他的观察者需要这个观察者的输出来工作。 我试图在相同的可观察的次数上进行订阅,但是在日志里面我看到原始的可观察性被多次启动。

多数民众赞成我的观察这是创build对象:

Observable.create((Observable.OnSubscribe<Api>) subscriber -> { if (mApi == null) { //do some work } subscriber.onNext(mApi); subscriber.unsubscribe(); }) 

多数民众赞成我的observable需要的对象

 loadApi().flatMap(api -> api....())); 

我在用着

 .subscribeOn(Schedulers.io()) observable.observeOn(AndroidSchedulers.mainThread()) .unsubscribeOn(Schedulers.io() 

在所有的观察。

Solutions Collecting From Web of "RxJava在多个用户之间共享可观测的排放"

我不确定我是否正确地理解了你的问题,但是我想你正在寻找一种方法来分享几个用户之间的观测值的排放量。 有几种方法可以做到这一点。 例如,你可以使用一个Connectable Observable,像这样:

 ConnectableObservable<Integer> obs = Observable.range(1,3).publish(); obs.subscribe(item -> System.out.println("Sub A: " + item)); obs.subscribe(item -> System.out.println("Sub B: " + item)); obs.connect(); //Now the source observable starts emitting items 

输出:

 Sub A: 1 Sub B: 1 Sub A: 2 Sub B: 2 Sub A: 3 Sub B: 3 

或者,您可以使用PublishSubject :

 PublishSubject<Integer> subject = PublishSubject.create(); //Create a publish subject subject.subscribe(item -> System.out.println("Sub A: " + item)); //Subscribe both subscribers on the publish subject subject.subscribe(item -> System.out.println("Sub B: " + item)); Observable.range(1,3).subscribe(subject); //Subscribe the subject on the source observable 

输出:

 Sub A: 1 Sub B: 1 Sub A: 2 Sub B: 2 Sub A: 3 Sub B: 3 

这两个示例都是单线程的,但是您可以轻松地添加observeOn或subscirbeOn调用来使其成为asynchronous。

首先使用Observable.create是棘手的,容易出错。 你需要类似的东西

 Observable.create(subscriber -> { if (mApi == null) { //do some work } if (!subscriber.isUnsubscribed()) { subscriber.onNext(mApi); subscriber.onCompleted(); // Not subscriber.unsubscribe(); } }) 

您可以使用

 ConnectableObservable<Integer> obs = Observable.just(1).replay(1).autoConnect(); 

所有后来的订户应该得到单个排放物品

 obs.subscribe(item -> System.out.println("Sub 1 " + item)); obs.subscribe(item -> System.out.println("Sub 2 " + item)); obs.subscribe(item -> System.out.println("Sub 3 " + item)); obs.subscribe(item -> System.out.println("Sub 4 " + item));