RXJava share()不能与Observable.create()一起使用

时间:2016-11-14 22:28:39

标签: java rx-java

此代码

public class ConnectObs {
public static void main(String[] args) {

    Observable<Integer> intsObservable = Observable.just(1, 2);
    intsObservable = intsObservable.share();

    intsObservable.subscribe(s->System.out.println("A " + s));
    intsObservable.subscribe(s->System.out.println("B " + s));

    intsObservable  = Observable.create(s -> {
        s.onNext(1);
        s.onNext(2);
    });
    intsObservable = intsObservable.share();

    intsObservable.subscribe(s->System.out.println("C " + s));
    intsObservable.subscribe(s->System.out.println("D " + s));
  }
}

产生A,B和C的结果。但不是D - 为什么会这样?

以下结果:

A 1
A 2
B 1
B 2
C 1
C 2

1 个答案:

答案 0 :(得分:2)

Observable.just与您的自定义Observable(不是安全构建的)之间的重要区别在于您没有完成流,因此当{C订阅仍处于活动状态时D 1}}订阅发生,所以D只是等待更多未发生的排放。

您的创作应如下所示:

Observable.<Integer> create(s -> {
        s.onNext(1);
        s.onNext(2);
        s.onCompleted();
})
//prevent MissingBackpressureException
.onBackpressureBuffer();

为了对订阅者更友好,您可以添加unsubscribe个检查:

Observable.<Integer> create(s -> {
        s.onNext(1);
        if (!s.isUnsubscribed())
            s.onNext(2);
        if (!s.isUnsubscribed())
            s.onCompleted();
}).onBackpressureBuffer();