我正在制作Android应用,有一个初学者的问题: 有没有办法推迟Observables排放,直到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