When creating an Observable like this:
public void foo() {
Observable observable = Observable.fromCallable(() -> {
bar();
return "";
})
.doOnSubscribe(disposable -> System.out.println("onSubscribe"))
.doOnDispose(() -> System.out.println("onDispose"));
Disposable disposable = observable.subscribe();
disposable.dispose();
}
private void bar() {
System.out.println("bar");
}
doOnSubcribe
is called, doOnDispose
is not called.
Why is that?
You need to use the doFinally()
operator.
doOnDispose()
has a very narrow use case, where the observable is explicitly disposed. In your example, the observable terminates "naturally" by onComplete()
. By the time that you call dispose()
, the observable is done, and nothing will happen -- disposing a completed observable has no effect.