前言:
学习这个操作符之前,请确保你读过这篇文章:RxJava2 转换操作符之FlatMap()方法,或者已经充分了解FlatMap()。因为这个方法,也是基于FlatMap的。
一、SwitchMap操作流程图
如图所示,上面有三个圆任务。当上一个任务尚未完成时,就开始下一个任务的话,上一个任务就会被取消掉。如果,都是在同一个线程里跑的话。那么,这个操作符与ContactMap就无异了,都是先跑的先到。只有在不同的线程里跑的时候,即线程方案为newThread的时候。才会出现这种情况。废话不多说,上两种情况的代码和输出对比,一目了然:
二、同一线程中,使用SwitchMap()
public static void actionSwitchMap() {
List<Integer> list = Arrays.asList(1, 2, 3, 4);
Observable.fromIterable(list)
.switchMap(new Function<Integer, ObservableSource<String>>() {
@Override
public ObservableSource<String> apply(Integer integer) throws Exception {
return Observable.just("integer=" + integer);
}
}).subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
log("accept=" + s + Utils.getThreadName());
}
});
}
这是输出结果:
D/TransformingOperations: accept=integer=1 | ThreadName=main
D/TransformingOperations: accept=integer=2 | ThreadName=main
D/TransformingOperations: accept=integer=3 | ThreadName=main
D/TransformingOperations: accept=integer=4 | ThreadName=main
三、不同一线程中,使用SwitchMap()
public static void actionSwitchMap() {
List<Integer> list = Arrays.asList(1, 2, 3, 4);
Observable.fromIterable(list)
.switchMap(new Function<Integer, ObservableSource<String>>() {
@Override
public ObservableSource<String> apply(Integer integer) throws Exception {
return Observable.just("integer=" + integer).subscribeOn(Schedulers.newThread());
}
}).subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
log("accept=" + s + Utils.getThreadName());
}
});
}
这是输出结果:
D/TransformingOperations: accept=integer=4 | ThreadName=RxNewThreadScheduler-4
四、总结
通过二和三的对比,我们可以看到,正如前文所述。当在同一线程中时,任务是按次序的,一一被执行完。而在不同线程中,如果前一个任务,尚未执行结束,就会被后一个任务给取消。所以,最后,打印出来的信息,只有4,而且是在第4条新线程中。
到此为止,SwitchMap操作符的讲解,已经全部说完了。如果,你还有什么疑惑不解,可以在评论区指出,下一篇是Scan()操作符。
附上可以跑的代码(0 warnings, 0 errors):
https://github.com/SuperBeagleDog/OkMVP
注意:
这个库里面有很多东西,RxJava2的转换操作符部分的demo位于:com.lyf.okmvp.demo.rxjava2包下的TransformingOperations类里面。
用法:
1、直接在com.lyf.okmvp.ui包下的MainActivity类里的onCreate()方法里面,直接调用:
TransformingOperations.actionSwitchMapWithinSameThreads(); // 静态方法。
TransformingOperations.actionSwitchMapWithinDifferentThreads(); // 静态方法。
2、也可以复制TransformingOperations类到你的项目里,去为所欲为。但前提时,你得有配置过RxJava和RxAndroid。配置方法,自行百度,或参考我的OkMVP库。