我有以下问题:
我有一个正在做一些工作的可观察对象,但是其他可观察对象需要该可观察对象的输出才能工作。我试图在同一个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()
所有可观测量。
答案 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));