对不起,如果以前已经回答了这个问题,但是从我的搜索中我找不到它,而且我真的很想知道它是如何工作的 - 如果它确实...
假设我有一个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:伪代码,对于轻微错误(如果有的话)抱歉。
答案 0 :(得分:0)
按预期工作。如果您将System.out.println(s)
放入obs2
,您会看到它收到“Hakuna Matata”,但由于您处置了其消费者,因此不会进一步转发它。如果你保留对任何局部变量的引用,它们就不会被垃圾收集。