前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RxJava2 多线程

RxJava2 多线程

作者头像
码客说
发布2019-10-22 17:11:56
5300
发布2019-10-22 17:11:56
举报
文章被收录于专栏:码客码客

前言

  • subscribeOn 指定Observable自身在哪个调度器上执行
  • observeOn 指定一个观察者在哪个调度器上观察这个Observable

subscribeOn这个操作符指定的是Observable自身在哪个调度器上执行,而且跟调用的位置没有关系。

observableOn则是指定一个观察者在哪个调度器上观察这个Observable

多次调用

  • 如果多次调用subscribeOn 只有第一次调用subscribeOn时选择的调度器.subscribeOn(Schedulers.newThread())有作用,而后来选择的都没有作用。
  • 当每次调用了observableOn这个操作符时,之后都会在选择的调度器上进行观察,直到再次调用observableOn切换了调度器。

这说明了subscribeOn这个操作符,与调用的位置无关,而且只有第一次调用时会指定Observable自己在哪个调度器执行。

其实有一种情况特殊,就是在doOnSubscribe操作符之后调用,可以使doOnSubscribe在指定的调度器中执行。

比如如下代码

代码语言:javascript
复制
Observable<String> obs = Observable.create(new ObservableOnSubscribe<String>() {
    @Override
    public void subscribe(ObservableEmitter<String> emitter) throws Exception {
        System.out.println("Observable:" + Thread.currentThread().getId());
        emitter.onNext("数据");
        emitter.onComplete();
    }
});

obs
    .subscribeOn(Schedulers.io())
    .map(new Function<String, String>() {
        @Override
        public String apply(String o) throws Exception {
            System.out.println("map01:" + Thread.currentThread().getId());
            return o;
        }
    })
    .observeOn(Schedulers.io())
    .map(new Function<String, String>() {
        @Override
        public String apply(String o) throws Exception {
            System.out.println("map02:" + Thread.currentThread().getId());
            return o;
        }
    })
    .observeOn(Schedulers.newThread())
    .map(new Function<String, String>() {
        @Override
        public String apply(String o) throws Exception {
            System.out.println("map03:" + Thread.currentThread().getId());
            return o;
        }
    })
    .observeOn(Schedulers.newThread())
    .subscribe(new Consumer<String>() {
        @Override
        public void accept(String o) throws Exception {
            System.out.println("subscribe:" + Thread.currentThread().getId());
        }
    });

会打印

代码语言:javascript
复制
Observable:12
map01:12
map02:13
map03:14
subscribe:15
  • 如果不指定subscribeOn 那么会在当前所在线程中操作
  • 只要不调用observeOn 那么后续的操作一直会在之前的线程中操作
  • 多次调用subscribeOn(Schedulers.io())会在不同的线程中操作
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-08-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 多次调用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档