如何在RxJava 2中放置内部可观察量?

时间:2016-10-03 12:26:18

标签: java rx-java

对不起,如果以前已经回答了这个问题,但是从我的搜索中我找不到它,而且我真的很想知道它是如何工作的 - 如果它确实...

假设我有一个PublishSubject,它采用如下字符串:

PublishSubject<String> trigger = PublishSubject.create();

我将它与另一个可观察者一起使用:

Observable<String> obs1 = trigger.filter(new Predicate<String>(){
    @Override
    public boolean test(String s) throws Exception{
        return s != null;
    }
});

Observable<String> obs2 = Observable.create(new ObservableOnSubscribe<String>(){
    @Override
    public void subscribe(final ObservableEmitter<String> e) throws Exception {
        //When/is this ever disposed? 
        obs1.subscribe(new Consumer<String>(){
            @Override
            public void accept(String s){
                //Never called after obs1 is disposed.
                e.onNext(s);
            }
        }        
    }
});

//A
Disposable disposable = obs2.subscribe(new Consumer<String>(){
    public void accept(String s){
        System.out.println(s);
    }
});


trigger.onNext("Holahoop"); //Above "A" is called.

disposable.dispose();

trigger.onNext("Hakuna Matata"); //Nothing happens. 

期望:

调用obs1订阅,e.onNext被调用,但自从它被处理后 - 呼叫追踪就在那里结束。

现实

根本没有调用Obs 1订阅。即使我没有明确取消订阅。

我的问题

为什么?是否自动取消订阅/处置在引擎盖下?处置外部可观测量时是GCd吗?请赐教!

注1:这是使用RxJava 2.0.0-RC3。

注意2:伪代码,对于轻微错误(如果有的话)抱歉。

1 个答案:

答案 0 :(得分:0)

按预期工作。如果您将System.out.println(s)放入obs2,您会看到它收到“Hakuna Matata”,但由于您处置了其消费者,因此不会进一步转发它。如果你保留对任何局部变量的引用,它们就不会被垃圾收集。