RxJava2 转换操作符之SwitchMap()

时间:2022-02-20 17:50:11

前言:
学习这个操作符之前,请确保你读过这篇文章:RxJava2 转换操作符之FlatMap()方法,或者已经充分了解FlatMap()。因为这个方法,也是基于FlatMap的。

一、SwitchMap操作流程图

RxJava2 转换操作符之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库。