RxJava2笔记(2)—线程切换基础

0.前言

本文着重来讲RxJava的线程控制。

正常情况下, 事件收发的俩端(Observer/Observable)都是线程统一的,即发送端在哪个线程发送事件,接收端则在哪个线程接收事件。

校验线程代码:

Log.d(TAG, Thread.currentThread().getName());

1.subscribeOn与observeOn

子线程做耗时操作,譬如请求网络,操作数据库,然后更新UI,这种是Android应用开发内的基本常规需求,RxJava肯定也是支持的,就是用到”subscribeOn与observeOn”这俩个操作符。

1.1.线程切换基本测试代码:

   Observable.create(new ObservableOnSubscribe<Integer>() {

            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                Log.d(TAG, "Observable   线程名称:   >>>  "+ Thread.currentThread().getName());
                emitter.onNext(1);
                emitter.onNext(2);
                emitter.onNext(3);
                emitter.onComplete();
            }

        }).subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<Integer>() {

            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, "subscribe");
            }

            @Override
            public void onNext(Integer value) {
                Log.d(TAG, "Observer  onNext   线程名称:   >>>  "+ Thread.currentThread().getName() + "_____接收到的值 >>> " + value);
            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "error");
            }

            @Override
            public void onComplete() {
                Log.d(TAG, "complete");
            }

        });

实际作的修改(伪代码):

Observable.subscribe(Observer)

改成了

Observable.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).subscribe(Observer)

也就是在subscribe之前加了俩句:

subscribeOn(Schedulers.newThread())

observeOn(AndroidSchedulers.mainThread())

输出结果:

事件发送端:【subscribeOn >> Schedulers.newThread()】
Observable   线程名称:   >>>  RxNewThreadScheduler-3
Observable   线程名称:   >>>  RxNewThreadScheduler-1

事件接收端:【observeOn >> AndroidSchedulers.mainThread()】
Observer  onNext   线程名称:   >>>  main_____接收到的值 >>> 1
Observer  onNext   线程名称:   >>>  main_____接收到的值 >>> 2
Observer  onNext   线程名称:   >>>  main_____接收到的值 >>> 3

1.2.线程切换——测试代码2:

多次指定事件发送端Observable的线程只有第一次指定的有效, 也就是说多次调用subscribeOn() 只有第一次的有效, 其余的会被忽略.

多次指定事件接收端Observer的线程是可以的, 也就是说每调用一次observeOn() , 事件接收端的线程就会切换一次.

2.线程种类:

  • Schedulers.io() 代表io操作的线程, 通常用于网络,读写文件等io密集型的操作
  • Schedulers.computation() 代表CPU计算密集型的操作, 例如需要大量计算的操作
  • Schedulers.newThread() 代表一个常规的新线程
  • AndroidSchedulers.mainThread() 代表Android的主线程

这些内置的Scheduler已经足够满足我们开发的需求, 因此我们应该使用内置的这些选项, 在RxJava内部使用的是线程池来维护这些线程, 所以效率也比较高.

接下来会连着俩篇案例进行一个线程切换的练习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值