Closed
Description
Recently discovered behaviour that brings incorrect order for Observable.doFinally
Here is code to check
@Test
public void operationFinallyOrder() throws Exception {
Single.error(new RuntimeException())
.doOnDispose(() -> System.out.println("Single.doOnDispose"))
.doFinally(() -> System.out.println("Single.doFinally"))
.subscribe(o -> System.out.println("Single.onSuccess"),
t -> System.out.println("Single.onError"));
System.out.println();
Completable.error(new RuntimeException())
.doOnDispose(() -> System.out.println("Completable.doOnDispose"))
.doFinally(() -> System.out.println("Completable.doFinally"))
.subscribe(() -> System.out.println("Completable.onComplete"),
t -> System.out.println("Completable.onError"));
System.out.println();
Observable.error(new RuntimeException())
.doOnDispose(() -> System.out.println("Observable.doOnDispose"))
.doFinally(() -> System.out.println("Observable.doFinally"))
.subscribe(o -> System.out.println("Observable.onNext"),
t -> System.out.println("Observable.onError"),
() -> System.out.println("Observable.onComplete"));
System.out.println();
Observable.just(new Object())
.doOnDispose(() -> System.out.println("Observable.doOnDispose"))
.doFinally(() -> System.out.println("Observable.doFinally"))
.subscribe(o -> System.out.println("Observable.onNext"),
t -> System.out.println("Observable.onError"),
() -> System.out.println("Observable.onComplete"));
}
Output:
Single.onError
Single.doFinally
Completable.onError
Completable.doFinally
Observable.doOnDispose
Observable.doFinally
Observable.onError
Observable.onNext
Observable.doOnDispose
Observable.doFinally
Observable.onComplete
As you can see, order and amount of messages for Single and Completable are correct, but LambdaObserver
calls dispose before terminal event. That triggers doFinally too early.
According to new lifecycle (confirmed here #4811) no messages Observable.doOnDispose should be there.