【问题标题】:why rxjava Observable.subscribe(observer) return void?为什么 rxjava Observable.subscribe(observer) 返回 void?
【发布时间】:2017-06-16 07:01:35
【问题描述】:

当我使用 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]:https://i.stack.imgur.com/0owg1.png][1]

[[2]:https://i.stack.imgur.com/7H4av.jpg][2]

【问题讨论】:

    标签: rx-java rx-android


    【解决方案1】:

    可能是因为 Reactive Stream 合约​​。

    Reactive Stream README

    public interface Publisher<T> {
        public void subscribe(Subscriber<? super T> s);
    }
    

    Publisher的接口定义为return void。 RxJava Flowable 实现了该接口。并且 RxJava Observable 也遵循该合同。

    所以他们提供了一个subscribeWith() 来返回一个Disposable 而不是void。或者你可以使用那些可以给你一个一次性的重载方法例如:subscribe(consumer&lt;T&gt;,consumer&lt;Throwable&gt;,action)

    PS:以上是我的猜测。我不确定。

    【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 没错,但不幸的是,您并不总是有权实现或覆盖Observer#onSubscribe 方法。例如,我当前的问题是我将PublishSubject 作为Observer,并且我无法覆盖它的#onSubscribe
    【解决方案3】:

    您使用哪个版本的RxJava?使用 RxJava2 (io.reactivex.rxjava2):

    public abstract class Observable<T> implements ObservableSource<T> {
      ...
      public final Disposable subscribe() {...}
      ...
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-24
    • 2011-12-17
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 2019-10-08
    相关资源
    最近更新 更多