RxJava2 dispose()不';如果对doOnSubscribe()返回的对象调用,则无法工作

RxJava2 dispose()不';如果对doOnSubscribe()返回的对象调用,则无法工作,java,rx-java,rx-java2,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)

我在理解为什么下面的代码不起作用时遇到了问题。我是做错了什么,还是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());
}
private一次性存储可添加;
@试验
公开无效测试(){
最终测试观察者=新的测试观察者();
可观察的t=可观察的。刚好(10)
.延迟(100,时间单位.毫秒)
.doOnSubscribe(一次性->保存可添加=一次性);
t、 签署(观察员);
savedDisposable.dispose();//这不起作用
//observer.dispose();//这是可行的
assertTrue(observer.isDisposed());
}

回答发布的问题:

您正处于中间,因此结束代码<代码>一次性代码>代码不能知道它的上游已经被处理了,因为<代码>处理()/代码>调用总是向上行进。 有

DisposableObserver
ResourceObserver
subscribeWith
和lambda-
subscribe()
方法,它们将在最末端为您提供一个
一次性的
对象,您可以通过
dispose()
进行处置


但在问题列表上,OP希望消费者类型上出现一个
观察者
一次性
,并发现这可以通过受限泛型实现,例如:

public static <T, K extends Observer<T> & Disposable> K subscribe(
        Observable<T> o, K observer) {
    o.subscribe(observer);
    return observer;
}
publicstatick订阅(
可观测的(o,K观察者){
o、 签署(观察员);
返回观测器;
}

如果不工作,我假设assertTrue失败?@James是的,请避免交叉发布:
doOnSubscribe()
提供的一次性应用程序的有效用例是什么?官方文档和各种各样的教程似乎都没有充分强调应该避免使用
doOnSubscribe()
获取订阅的
一次性
。谢谢你的澄清。我有很多代码需要检查!