Skip to content

RxJava 2.0.4 Observable calls dispose before terminal event. #4956

Closed
@StanislavChumarin

Description

@StanislavChumarin

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions