Rxjava,如何推迟排放直到许多订阅者订阅?

时间:2015-05-10 14:29:51

标签: android rx-java

我正在制作Android应用,有一个初学者的问题: 有没有办法推迟Observables排放,直到2个订阅者订阅?因为我不希望第二个错过数据。 感谢

2 个答案:

答案 0 :(得分:5)

是的,使用ConnectableObservable类型进行确定性多播支持此用例。

使用它有两种方法。

第一个也是最简单的是使用publish重载,如下所示:

    Observable<Long> sourceToShare = Observable.interval(10, TimeUnit.MILLISECONDS);

    // multiple subscriptions deterministically subscribed to using publish()
    sourceToShare.publish(l -> {
        Observable<String> a = l.map(t -> "first subscriber " + t);
        Observable<String> b = l.buffer(4).map(t -> "second subscriber " + t);
        return Observable.merge(a, b);
    }).take(20).toBlocking().forEach(System.out::println);

或者,如果您需要在连接所有订阅者后手动控制源的启动和停止时间,您可以直接使用ConnectableObservable:

    Observable<Long> sourceToShare = Observable.interval(10, TimeUnit.MILLISECONDS);


    // multiple subscriptions deterministically subscribed to using ConnectableObservable
    ConnectableObservable<Long> published = sourceToShare.publish();

    Observable<String> a = published.map(t -> "first subscriber " + t);
    Observable<String> b = published.buffer(4).map(t -> "second subscriber " + t);
    Observable.merge(a, b).take(20).forEach(s -> System.out.println("published => " + s));

    // now that everything is wired up, connect the source
    published.connect();

    // since we are connecting asynchronously and need to 'connect' after subscribing
    // we have to manually give it time to execute
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

以下是文档的链接:

答案 1 :(得分:0)

如果您可以控制源Observable的创建,请查看defer函数。

如果您不这样做,请查看ReplaySubject

这“向所有观察者发出源Observable发出的所有项目,无论观察者何时订阅。”

您可以做的是,将ReplaySubject链接到您的来源Observable,然后通过调用Observable方法将主题asObservable()返回给您的来电者。然后,订阅的任何人都将获得源Observable

发出的所有项目

EG

ReplySubject replySubject = ReplySubject.create();
sourceObservable.subscribe(replySubject::onNext, replySubject::onError, replySubject::onCompleted);
return replySubject.asObservable();

如果您的源Observable非常繁忙,您可能需要创建时间或大小有界版本。看看JavaDoc