如果调用doOnSubscribe()返回的对象,则RxJava2 dispose()不起作用

时间:2017-04-20 07:52:11

标签: java rx-java rx-java2

我有一个问题,理解为什么以下代码不起作用。我做错了什么或者是RxJava2实现中的某种错误?

private Disposable savedDisposable;

@Test
public void test() {
    final TestObserver<Integer> observer = new TestObserver<>();

    Observable<Integer> t = Observable.just(10)
            .delay(100, TimeUnit.MILLISECONDS)
            .doOnSubscribe(disposable -> savedDisposable = disposable);

    t.subscribe(observer);

    savedDisposable.dispose();  //this doesn't work
    //observer.dispose();       //this works  

    assertTrue(observer.isDisposed());
}

1 个答案:

答案 0 :(得分:11)

回答发布的问题:

您正在处理中间,因此Disposable无法知道其上游已被处置,因为dispose()来电始终向上游传输。

DisposableObserverResourceObserversubscribeWith和lambda - subscribe()方法可以在最后找到Disposable个对象可以通过dispose()处理。

在问题列表中,结果发现OP希望ObserverDisposable出现在消费者类型上,并发现这可以通过约束泛型来实现,例如:

public static <T, K extends Observer<T> & Disposable> K subscribe(
        Observable<T> o, K observer) {
    o.subscribe(observer);
    return observer;
}