目的

了解 onNext、onComplete、doOnNext、doFinally、doAfterTerminate执行的执行顺序。

测试代码

import io.reactivex.Observable;
import org.junit.Test;

/**
 * @description: 测试onNext、onComplete、doOnNext、doFinally、doAfterTerminate执行顺序
 * @author: lizz
 * @date: 2020/11/17 17:56
 */
public class ExeOrder {
    @Test
    public void orderTester() {
        Observable.just("Hello Tester1")
                .doOnNext(s -> System.out.println("doOnNext:" + s))
                .doFinally(() -> System.out.println("doFinally1"))
                .doAfterTerminate(() -> System.out.println("doAfterTerminate1"))
                .doFinally(() -> System.out.println("doFinally2"))
                .doAfterTerminate(() -> System.out.println("doAfterTerminate2"))
                .subscribe(
                        s -> System.out.println("onNext:" + s),
                        throwable -> System.out.println("onError" + throwable),
                        () -> System.out.println("onComplete"));
        System.out.println("*******调整顺序**********");
        //调整顺序
        Observable.just("Hello Tester2")
                .doAfterTerminate(() -> System.out.println("doAfterTerminate1"))
                .doFinally(() -> System.out.println("doFinally1"))
                .doOnNext(s -> System.out.println("doOnNext:" + s))
                .doAfterTerminate(() -> System.out.println("doAfterTerminate2"))
                .doFinally(() -> System.out.println("doFinally2"))
                .subscribe(
                        s -> System.out.println("onNext:" + s),
                        throwable -> System.out.println("onError" + throwable),
                        () -> System.out.println("onComplete"));
    }
}

执行结果

结果分析

  • 优先级doOnNext>onNext>onComplete>doFinally/doAfterTerminate
  • doFinally和doAfterTerminate执行顺序不固定,由onComplete方法执行完成后向上游依次执行,离得"近"的优先执行。
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐