RxJava2 学习教程(二)线程调度

线程的调度又叫线程的切换,在Rxjava是默认规则中,事件的发出(由被观察者完成)和消费(由观察者完成)是在同一个线程中,但是在实际开发中,我们经常会遇到类似的情景:在子线程中进行耗时的操作,然后回到主线程进行UI操作,在这种情况下显然需要进行线程的切换,这时我们如何来完成呢?本节将进行讲解。

文章线索:
  • Observable(被观察者)和Observer()默认的工作线程
  • 观察者和被观察者如何进行不同线程切换
  • 关于ObserverOn()与SubscribeOn(),我们了解多少?
  • Rxjava中内置了哪些线程?有什么区别?
  • 通过实战了解和学习Rxjava2中线程的调度
线程如何切换
Observable和Observer默认在主线程中执行
  Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                emitter.onNext(1);
                emitter.onNext(2);
                emitter.onNext(3);
                emitter.onNext(4);
                Log.d(TAG, "Observable thread is : " + Thread.currentThread().getName());
                emitter.onComplete();
            }
        }).subscribe(new Observer<Integer>() {

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

            @Override
            public void onNext(Integer integer) {
                Log.d(TAG, "Observer thread is :" + Thread.currentThread().getName());
                Log.d(TAG, "onNext: " + integer);

            }

            @Override
            public void onError(Throwable e) {

            }

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

运行结果如下:

GfW9Pg.png

从代码中可以看出,当不指定Observable和Observer所在线程时,默认他们都工作在主线程,被观察者在主线程分别发射了整型数据的1,2,3,4事件,观察者在主线程依次接收,直到事件完成。

观察者和被观察者如何在不同线程中进行切换

在上面的例子中,默认情况下观察者和被观察者都工作在主线程,即主线程发送数据和主线程接收,假如我们需要实现被观察者在子线程中发送数据,然后观察者在主线程中进行接收,那么通过RxJava 内置的线程调度器就可以很轻松的实现,实现代码如下:

   Observable.create(new ObservableOnSubscribe<Integer>() {
            @SuppressLint("LongLogTag")
            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                for (int i = 0; i < 4; i++) {
                    Log.e(TAG, "上游被观察者Observable在子线程为" + Thread.currentThread().getName() + "生产一个事件: " + i );
                    emitter.onNext(i);
                    SystemClock.sleep(3000);
                }
                emitter.onComplete();
            }
        }).subscribeOn(Schedulers.newThread())
          .observeOn(AndroidSchedulers.mainThread())
          .subscribe(new Observer<Integer>() {
              @Override
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值