RxJava2:observeOn和subscribeOn的使用

知识背景:
扔物线的金典RxJava
RxJava进阶一
RxJava进阶二
RxJava进阶三
RxJava进阶四

RxJava的好处大家都知道,能使代码逻辑结构看起来更清晰,当需要进行前后台处理的时候,一般会进行observeOn和subscribeOn的调用,然而这2个方法的调用没有那么简单:
observeOn:设置Observer观察者在什么线程运行;
subscribeOn:设置Observable被观察者在什么线程运行;

以上是最基本的使用,但是在使用的时候,调用的顺序和次数都会有影响:
subscribeOn: subscribeOn 作用于该操作符之前的 Observable 的创建操符作以及 doOnSubscribe 操作符
observeOn: observeOn除了设置Observer观察者在什么线程运行,还将影响后面的onNext,map….的运行线程.

上实例:

 Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                Log.d(TAG, "Observable thread is : " + Thread.currentThread().getName());
                Log.d(TAG, "emit 1");
                emitter.onNext(1);

            }
        });
        //该类只接收next发出的事件
        Consumer<Integer> consumer = new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.d(TAG, "Observer thread is :" + Thread.currentThread().getName());
                Log.d(TAG, "onNext: " + integer);
            }
        };

        observable
           .doOnNext(new Consumer<Integer>() {
                @Override
                public void accept(Integer integer) throws Exception {
                    Thread.sleep(10000);
                    Log.d(TAG, "a thread is: " + Thread.currentThread().getName());
                    Log.d(TAG, "doOnNext a: " + integer);
                }
            })
//            
           .flatMap(new Function<Integer, ObservableSource<Integer>>() {
                    @Override
                    public ObservableSource<Integer> apply(@NonNull Integer integer) throws Exception {
                        Thread.sleep(10000);
                        Log.d(TAG, "c thread is: " + Thread.currentThread().getName());
                        Log.d(TAG, "doOnNext c: " + integer);
                        return Observable.just(integer);
                    }
                })
                .subscribeOn(Schedulers.newThread())
            .doOnNext(new Consumer<Integer>() {
                @Override
                public void accept(Integer integer) throws Exception {
                    Thread.sleep(10000);
                    Log.d(TAG, "b thread is : " + Thread.currentThread().getName());
                    Log.d(TAG, "doOnNext b: " + integer);
                }
            })
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(consumer);

如果把observeOn的方法放到前面,可以看看各个方法所在的线程

 Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                Log.d(TAG, "Observable thread is : " + Thread.currentThread().getName());
                Log.d(TAG, "emit 1");
                emitter.onNext(1);

            }
        });
        //该类只接收next发出的事件
        Consumer<Integer> consumer = new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.d(TAG, "Observer thread is :" + Thread.currentThread().getName());
                Log.d(TAG, "onNext: " + integer);
            }
        };

        observable
           .doOnNext(new Consumer<Integer>() {
                @Override
                public void accept(Integer integer) throws Exception {
                    Thread.sleep(10000);
                    Log.d(TAG, "a thread is: " + Thread.currentThread().getName());
                    Log.d(TAG, "doOnNext a: " + integer);
                }
            })
//
           .flatMap(new Function<Integer, ObservableSource<Integer>>() {
                    @Override
                    public ObservableSource<Integer> apply(@NonNull Integer integer) throws Exception {
                        Thread.sleep(10000);
                        Log.d(TAG, "c thread is: " + Thread.currentThread().getName());
                        Log.d(TAG, "doOnNext c: " + integer);
                        return Observable.just(integer);
                    }
                })
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .doOnNext(new Consumer<Integer>() {
                @Override
                public void accept(Integer integer) throws Exception {
                    Thread.sleep(10000);
                    Log.d(TAG, "b thread is : " + Thread.currentThread().getName());
                    Log.d(TAG, "doOnNext b: " + integer);
                }
            })

            .subscribe(consumer);

参考官方说明http://reactivex.io/documentation/operators/observeon.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fishmov

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值