为什么RxJava中的Observable.subscribe(observer)返回void?

6
当我正常使用Observable.subscribe()时,通常会返回可处置对象(Disposable)。
但是,Observable.subscribe(Observer) 返回的是void。
所以,我无法将其处置为Observable.subscribe(Observer)。
根据introtorx.com,Observable.subscribe(Obeserver) 返回Disposable。
为什么Rx和RxJava不同?
++++++++++++++
我在Android Studio中使用compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
github.com/ReactiveX/RxJava/blob/2.x/src/main/java/io/reactivex/Observable.java#L10831
public final void subscribe(Observer<? super T> observer) {
  ... 
}

[[1]: 这是一个指向图片的链接[1]

[[2]: 这是另一个指向图片的链接[2]

3个回答

3
可能是因为Reactive Stream协议导致的。请参考Reactive Stream README了解更多信息。
public interface Publisher<T> {
    public void subscribe(Subscriber<? super T> s);
}

Publisher 接口定义了返回 void。RxJava Flowable 实现了该接口。而 RxJava Observable 也遵循这个约定。

因此,它们提供了一个 subscribeWith() 方法,以返回 Disposable 而不是 void。或者你可以使用那些重载方法,它们也可以给你返回 disposable,例如: subscribe(consumer<T>,consumer<Throwable>,action)

注意: 上述内容是我的猜测,我不确定是否正确。


1
确认。您可以在这里这个问题中阅读更多相关信息。 - Incinerator

1
在RxJava2中,Disposable对象被传递给Observer的onSubscribe回调方法。您可以从onSubscribe回调方法中获取Disposable对象,并在订阅观察者到可观察对象后,在稍后的时间点使用它来处理订阅。

没错,但不幸的是,您并不总是有权限实现或覆盖Observer#onSubscribe方法。 例如,我的当前问题是我将PublishSubject作为一个Observer,而我无法覆盖它的#onSubscribe方法。 - Dmitriy Popov

0
你使用的是哪个版本的 RxJava?如果是 RxJava2 (io.reactivex.rxjava2):
public abstract class Observable<T> implements ObservableSource<T> {
  ...
  public final Disposable subscribe() {...}
  ...
}

我在AndroidStudio上使用compile 'io.reactivex.rxjava2:rxandroid:2.0.1'。 - coolsik
public final void subscribe(Observer<? super T> observer) { ... }请将上述代码翻译成中文。 - coolsik
没错!这是因为ObserveronSubscribe(...)中接收了Disposable。你必须使用Consumer - Kevin Robatel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接