map和flatMap的区别
首先说下map和flatMap的区别,防止有对RxJava还不够熟悉的小伙伴
- map的Function指定如何将A转为B
- flatMap的Function则指定如何将Observable<A>转为Observable<B>
- map和flatMap最终的转换结果都是Observable<B>
- flatMap由于可以自己创建Observable,因此更为强大灵活,map比较简单
Observable生命周期测试
下面,我们创建一个Observable,并通过map和flatMap进行多次Observable转换
分别在正常流程和异常流程下,测试map过程中各个Observable的生命周期执行流程
import io.reactivex.rxjava3.core.Observable;
@SuppressWarnings("all")
public class RxJavaMapTest {
public static class Action {
public static String A() {
System.out.println("A Execute");
return "A";
}
public static Observable<String> B() {
System.out.println("B Execute");
return Observable.just("B");
}
public static Observable<String> C() {
System.out.println("C Execute");
//throw new RuntimeException("Error");
return Observable.just("C");
}
public static Observable<String> D() {
System.out.println("D Execute");
return Observable.just("D");
}
public static Observable<String> E() {
System.out.println("E Execute");
return Observable.just("E");
}
}
public static void main(String[] args) {
Observable.just("")
.map(o -> Action.A())
.doOnSubscribe(aAction -> {
System.out.println("doOnSubscribe A");
})
.doOnNext(o -> {
System.out.println("doOnNext A1");
})
.doOnNext(o -> {
System.out.println("doOnNext A2");
})
.doOnError(e -> {
System.out.println("doOnError A");
})
.doOnComplete(() -> {
System.out.println("doOnComplete A");
})
.doFinally(() -> {
System.out.println("doOnFinally A");
})
.flatMap(o -> Action.B())
.doOnSubscribe(aAction -> {
System.out.println("doOnSubscribe B");
})
.doOnNext(o -> {
System.out.println("doOnNext B");
})
.doOnError(e -> {
System.out.println("doOnError B");
})
.doOnComplete(() -> {
System.out.println("doOnComplete B");
})
.doFinally(() -> {
System.out.println("doOnFinally B");
})
.flatMap(o -> Action.C())
.doOnSubscribe(o -> {
System.out.println("doOnSubscribe C");
})
.doOnNext(o -> {
System.out.println("doOnNext C");
})
.doOnError(e -> {
System.out.println("doOnError C");
})
.doOnComplete(() -> {
System.out.println("doOnComplete C");
})
.doFinally(() -> {
System.out.println("doOnFinally C");
})
.flatMap(o -> Action.D())
.doOnSubscribe(o -> {
System.out.println("doOnSubscribe D");
})
.doOnNext(o -> {
System.out.println("doOnNext D");
})
.doOnError(e -> {
System.out.println("doOnError D");
})
.doOnComplete(() -> {
System.out.println("doOnComplete D");
})
.doFinally(() -> {
System.out.println("doOnFinally D");
})
.flatMap(o -> Action.E())
.doOnSubscribe(o -> {
System.out.println("doOnSubscribe E");
})
.doOnNext(o -> {
System.out.println("doOnNext E");
})
.doOnError(e -> {
System.out.println("doOnError E");
})
.doOnComplete(() -> {
System.out.println("doOnComplete E");
})
.doFinally(() -> {
System.out.println("doOnFinally E");
})
.subscribe(
o -> System.out.println("doOnFinally X"),
e -> System.out.println("doOnError X"),
() -> System.out.println("doOnFinally X")
);
System.out.println("Task Finish");
}
}
正常情况下的运行结果
doOnSubscribe A
doOnSubscribe B
doOnSubscribe C
doOnSubscribe D
doOnSubscribe E
A Execute
doOnNext A1
doOnNext A2
B Execute
doOnNext B
C Execute
doOnNext C
D Execute
doOnNext D
E Execute
doOnNext E
doOnFinally X
doOnComplete A
doOnComplete B
doOnComplete C
doOnComplete D
doOnComplete E
doOnFinally X
doOnFinally E
doOnFinally D
doOnFinally C
doOnFinally B
doOnFinally A
Task Finish
C发生异常时的运行结果
doOnSubscribe A
doOnSubscribe B
doOnSubscribe C
doOnSubscribe D
doOnSubscribe E
A Execute
doOnNext A1
doOnNext A2
B Execute
doOnNext B
C Execute
doOnFinally A
doOnFinally B
doOnError C
doOnFinally C
doOnError D
doOnFinally D
doOnError E
doOnError X
doOnFinally E
Task Finish
下面,我们基于以上两次运行结果进行分析文章来源:https://www.toymoban.com/news/detail-745717.html
如果有其它更深层次的疑问,可以复制以上代码,自己调整继续运行文章来源地址https://www.toymoban.com/news/detail-745717.html
正常流程下的生命周期流程
- ABCDEX依次执行onSubscribe
- ABCDE依次执行Function和onNext
- ABCDEX依次执行onComplete
- XEDCBD依次执行onFinally
C发生异常时的生命周期流程
- ABCDE依次执行onSubscribe
- AB依次执行Function和onNext
- C执行Function,但触发Error
- AB不再执行onComplete,依次执行onFinally
- C执行onError和onFinally
- D执行onError和onFinally
- E执行onError
- X执行onError
- E执行onFinally
流程分析
- 执行subscribe方法之后,B订阅A,C订阅B。。。
- 无异常时,onFinally是按EDCBD顺序执行的,说明Subscriber工作全部完成后,Observable才会执行onFinally
- C触发Error后,AB都不执行onComplete,说明Subscriber处理时发生错误,Observable也会被视为工作未完成
- C触发Error后,AB立刻执行onFinally,说明Subscriber发生异常时,Observable工作直接结束
- C触发Error后,AB不执行onError,但DE会执行onError,说明Observable错误,会引发Subscriber错误
多次map过程中,异常处理方式可以总结为
- 发生异常时,所有的OnSubscribe都会执行
- 发生异常时,所有的OnFinally都会执行
- 发生异常时,所有的OnComplete都不会执行
- 发生异常时,后续的OnError都会执行
- 发生异常时,后续的OnNext都不会执行
- 发生异常时,后续的Function都不会执行
多次map过程中,Function的处理方式
- 多次map实际上是依次订阅的关系,B订阅A,再将自己的结果发射给C
- map方法只是创建了一个起到包装作用的Observable,将所有回调对象,和用于转换的Function保存了起来
- Function并不会立即执行,而是等subscribe之后,等到上个Observable处理成功,才会执行
subscribe回调和doOn系列回调的区别
- 效果一样,只是给Observable提供了不同的回调设置方式
- subscribe回调是设置给最后一个Observable的,和前面代码没有任何关系,不要复杂化
- 一个Observable可以有多个回调,它们都会生效,并不会相互覆盖,按设置先后顺序执行
到了这里,关于【RxJava】map过程中各个Observable生命周期分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!