6

在 RxJava 1 中,使用 Observer 订阅会返回一个可以取消订阅的订阅。

在 RxJava 2 中,使用 Observer 订阅会返回 void 并且没有 Disposeable。怎么可能停止那个“订阅”?

// v1
rx.Observable<Long> v1hot = rx.Observable.interval(1, TimeUnit.SECONDS);
rx.Observer<Long> v1observer = new TestSubscriber<>();
Subscription subscription = v1hot.subscribe(v1observer);
subscription.unsubscribe();

// v2
Observable<Long> v2hot = Observable.interval(1, TimeUnit.SECONDS);
Observer<Long> v2Observer = new TestObserver<>();
v2hot.subscribe(v2Observer); // void

编辑:如何处理这种情况,我们使用本身不实现的观察者Disposable,比如BehaviorSubject?就像在这个例子中一样:

// v1
rx.Observable<Long> v1hot = rx.Observable.interval(1, TimeUnit.SECONDS);
rx.Observer<Long> v1observer = rx.subjects.BehaviorSubject.create();
Subscription subscription = v1hot.subscribe(v1observer);
subscription.unsubscribe();

// v2
Observable<Long> v2hot = Observable.interval(1, TimeUnit.SECONDS);
Observer<Long> v2Observer = BehaviorSubject.createDefault(-1L);
v2hot.subscribe(v2Observer); // void
4

2 回答 2

9

所有 其他 订阅 方法都 返回一个Disposable. 在您的示例中,它TestObserver本身实现了Disposable,因此您可以调用dispose()观察者本身来处理订阅。

否则,您可以DisposableObserver将自己的自定义观察者用作基类,Disposable以使抽象基类为您提供行为。

编辑以回答更新的问题:

如果您需要使用该subscribe(Observer)方法(返回 void 的方法),但您需要使用Observer未实现的方法Disposable,您仍然可以选择将您的方法包装ObserverSafeObserver将为您提供Disposable行为的方法中(以及其他合同一致性保证) .

于 2017-01-02T15:27:17.160 回答
0

subscribe(Observer)您可以调用subscribeWith(DisposableObserver) 返回一次性的而不是调用。

于 2018-07-17T09:16:47.823 回答