RxJava在多个订户之间共享Observable的排放

时间:2016-04-23 00:32:05

标签: java android rx-java

我有以下问题:

我有一个正在做一些工作的可观察对象,但是其他可观察对象需要该可观察对象的输出才能工作。我试图在同一个observable上多次订阅,但在日志中我看到原始的observable被多次启动。

那是我的observable创建对象:

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

那是我需要对象的可观察对象

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

我正在使用

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

所有可观测量。

2 个答案:

答案 0 :(得分:13)

我不确定我是否正确理解了您的问题,但我认为您正在寻找一种方法来分享几个订阅者之间可观察量的排放量。有几种方法可以做到这一点。例如,您可以像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调用以使它们异步。

答案 1 :(得分:1)

首先使用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));