目的
了解 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方法执行完成后向上游依次执行,离得"近"的优先执行。