observeOn()与subscribeOn()的区别

        Observable.just("RxJava")
                .map(new Function<String, String>() {
                    @Override
                    public String apply(@NonNull String s) throws Exception {
                        Log.e("subscribeOn-最初的", Thread.currentThread().getName());
                        return Thread.currentThread().getName();
                    }
                })
                // subscribeOn的调用,改变了调用前序列所运行的线程
                .subscribeOn(AndroidSchedulers.mainThread())
                .map(new Function<String, String>() {
                    @Override
                    public String apply(@NonNull String s) throws Exception {
                        Log.e("subscribeOn-IoScheduler", Thread.currentThread().getName());
                        return Thread.currentThread().getName();
                    }
                })
                // observeOn的调用切换之后的线程
                // observeOn之后,不可再调用subscribeOn 切换线程
                .observeOn(new IoScheduler())
                .map(new Function<String, String>() {
                    @Override
                    public String apply(@NonNull String s) throws Exception {
                        Log.e("observeOn-mainThread", Thread.currentThread().getName());
                        return Thread.currentThread().getName();
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                        Log.e("observeOn-IoScheduler", Thread.currentThread().getName());
                    }
                });

由此可知,如果想多次切换线程,只需要observeOn就行。 那能不能多次调用subscribeOn呢?可以,但是不起作用。会被第一个subscribeOn屏蔽

subscribeOn() 和 observeOn() 都做了线程切换的工作。不同的是, subscribeOn() 的线程切换发生在 OnSubscribe 中,即在它通知上一级 OnSubscribe 时,这时事件还没有开始发送,因此 subscribeOn() 的线程控制可以从事件发出的开端就造成影响;而 observeOn() 的线程切换则发生在它内建的 Subscriber 中,即发生在它即将给下一级 Subscriber 发送事件时,因此 observeOn() 控制的是它后面的线程。

参考: https://segmentfault.com/a/1190000004856071 http://gank.io/post/560e15be2dca930e00da1083

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Hongten

lucene(全文搜索)_建立索引_根据关键字全文搜索_源码下载

=========================================================

19720
来自专栏用户画像

Ping++ 支付接口对接

14610
来自专栏葬爱家族

RxJava再回首

很早前就看了RxJava,当时就觉得好牛掰,但是公司项目一直没有用起来,知识不用就会忘,前段时间突然要写RxJava,发现已经不会写了。所以今天再回头整理一下R...

23110
来自专栏一直在跳坑然后爬坑

RxJava2操作符之“Skip”

Skip操作符可以说是上一篇Take操作符的兄弟 suppress the first n items emitted by an Observable 去...

11030
来自专栏蘑菇先生的技术笔记

qt5中信号和槽的新语法

32850
来自专栏Android开发与分享

【Android】RxJava的使用(二)Action

27460
来自专栏xingoo, 一个梦想做发明家的程序员

【手把手教你全文检索】Lucene索引的【增、删、改、查】

前言   搞检索的,应该多少都会了解Lucene一些,它开源而且简单上手,官方API足够编写些小DEMO。并且根据倒排索引,实现快速检索。本文就简单的实现增...

23950
来自专栏武军超python专栏

2018年7月21日python中的加密和解密

·在函数调用执行过程中: 如果出现return,return中的函数执行完则本函数就运行结束,return下面的语句不会再继续执行,所以return使 用时...

29850
来自专栏码神联盟

Shiro系列 | 《Shiro开发详细教程》第五章:Shiro编码加密

在涉及到密码存储问题上,应该加密或者生成密码摘要存储,而不是存储明文密码。为避免数据泄露对用户造成很大的损失,应该加密或者生成不可逆的摘要方式存储。

13120
来自专栏小鄧子的技术博客专栏

【译】对RxJava中.repeatWhen()和.retryWhen()操作符的思考

第一次见到.repeatWhen()和.retryWhen()这两个操作符的时候就非常困惑了。不得不说,它们绝对是“最令人困惑弹珠图”的有力角逐者。

13620

扫码关注云+社区

领取腾讯云代金券