Observable.publish()
和Observable.replay()
返回ConnectableObservable。
但是,当这些方法将接口作为参数(例如Observable.publish(Func1)
和Observable.replay(Func1)
)时,它们将返回Observable。
为什么他们返回Observable而不是ConnecatbleObservable?
如果我将这些方法与参数一起使用,我会得到Observable。
然后我将submit(Observer)
称为观察者,观察者将开始工作。
我无法调用connect()
,因为observable是Observable,而不是Connectable Observable。
如果我必须对ConnectableObservable使用Observable.publish(Func1)
和Observable.replay(Func1)
,我认为这些方法必须在ConnectableObservable中,而不是在Observable中。
为什么它们是Observable方法而不是ConnectableObservable方法?
答案 0 :(得分:3)
这些运算符在函数调用期间共享源,也就是说,您可以订阅提供给函数的Observable并根据需要应用运算符。那些不会触发多次订阅原始来源的人;但是每个订阅服务器都会单独发送给运营商的结果。因此,订阅本身会触发与上游的连接,而无需通过ConnectableObservable
手动执行此操作。
例如:
Observable.range(1, 10)
.doOnSubscribe(() -> System.out.println("Subscribed!"))
.publish(o -> Observable.zip(o, o.skip(1), (a, b) -> a + b))
.subscribe(System.out::println);
VS
Observable<Integer> o = Observable.range(1, 10)
.doOnSubscribe(() -> System.out.println("Subscribed!"));
Observable.zip(o, o.skip(1), (a, b) -> a + b)
.subscribe(System.out::println);
答案 1 :(得分:0)
我注意到那些方法使原始的ConnectableObservable发出原始值,但这些方法使返回的Observable发出转换后的值。 而且,如果用户希望只有特定的观察者获得转换后的值,那就有意义了。
但是,我仍然想知道为什么这些方法不在ConnectableObservable中。