Rxjava2入门教程四:Scheduler线程调度器(转)

如需下载源码,请访问

https://github.com/fengchuanfang/Rxjava2Tutorial

文章原创,转载请注明出处:

Rxjava2入门教程四:Scheduler线程调度器

Scheduler(线程调度器)赋予RxJava简洁明了的异步操作,可以说是RxJava中最值得称道的地方。

在之前的代码中,Observable发射数据流,Observer接收响应数据流,以及Operators加工数据流均是在同一个线程中,实现出来的是一个同步的函数响应式。但是函数响应式的实际应用却不是这样的,大部分都是后台处理,前台响应的一个过程。Observable生成发射数据流,以及Operators加工数据流都是在后台线程中进行,而Observer在前台线程中接受并相应数据。

Scheduler(线程调度器)可以让RxJava的线程切换变得简单明了,即使程序逻辑变得十分复杂,他依然能够保持简单明了。

subscribeOn

ObservablesubscribeOn(Scheduler scheduler)

subscribeOn通过接收一个Scheduler参数,来指定对数据的处理运行在特定的线程调度器Scheduler上。

若多次设定,则只有一次起作用。

observeOn

ObservableobserveOn(Scheduler scheduler)

observeOn同样接收一个Scheduler参数,来指定下游操作运行在特定的线程调度器Scheduler上。

若多次设定,每次均起作用。

Scheduler种类

Schedulers.io( ):

用于IO密集型的操作,例如读写SD卡文件,查询数据库,访问网络等,具有线程缓存机制,在此调度器接收到任务后,先检查线程缓存池中,是否有空闲的线程,如果有,则复用,如果没有则创建新的线程,并加入到线程池中,如果每次都没有空闲线程使用,可以无上限的创建新线程。

Schedulers.newThread( ):

在每执行一个任务时创建一个新的线程,不具有线程缓存机制,因为创建一个新的线程比复用一个线程更耗时耗力,虽然使用Schedulers.io( )的地方,都可以使用Schedulers.newThread( ),但是,Schedulers.newThread( )的效率没有Schedulers.io( )高。

Schedulers.computation():

用于CPU 密集型计算任务,即不会被 I/O 等操作限制性能的耗时操作,例如xml,json文件的解析,Bitmap图片的压缩取样等,具有固定的线程池,大小为CPU的核数。不可以用于I/O操作,因为I/O操作的等待时间会浪费CPU。

Schedulers.trampoline():

在当前线程立即执行任务,如果当前线程有任务在执行,则会将其暂停,等插入进来的任务执行完之后,再将未完成的任务接着执行。

Schedulers.single():

拥有一个线程单例,所有的任务都在这一个线程中执行,当此线程中有任务执行时,其他任务将会按照先进先出的顺序依次执行。

Scheduler.from(@NonNull Executor executor):

指定一个线程调度器,由此调度器来控制任务的执行策略。

AndroidSchedulers.mainThread():

在Android UI线程中执行任务,为Android开发定制。

注:

在RxJava2中,废弃了RxJava1中的Schedulers.immediate( )

在RxJava1中,Schedulers.immediate( )的作用为在当前线程立即执行任务,功能等同于RxJava2中的Schedulers.trampoline( )。

而Schedulers.trampoline( )在RxJava1中的作用是当其它排队的任务完成后,在当前线程排队开始执行接到的任务,有点像RxJava2中的Schedulers.single(),但也不完全相同,因为Schedulers.single()不是在当前线程而是在一个线程单例中排队执行任务。

示例一:使用一次subscribeOn和一次observeOn

schedulerDemo1.jpg

运行代码后,控制台打印如下:

System.out:发射线程:RxCachedThreadScheduler-1---->发射:0System.out:发射线程:RxCachedThreadScheduler-1---->发射:1System.out:接收线程:main---->接收:0System.out:发射线程:RxCachedThreadScheduler-1---->发射:2System.out:接收线程:main---->接收:1System.out:发射线程:RxCachedThreadScheduler-1---->发射:3System.out:接收线程:main---->接收:2System.out:发射线程:RxCachedThreadScheduler-1---->发射:4System.out:接收线程:main---->接收:3System.out:接收线程:main---->接收:4

通过subscribeOn(Schedulers.io())指定Observable在Schedulers.io( )调度器的线程中,每隔1秒发射一次数据,通过observeOn(AndroidSchedulers.mainThread())指定Observer在Android UI线程中接收数据。

示例二:使用两次subscribeOn和一次observeOn

schedulerDemo2.jpg

通过subscribeOn(Schedulers.io())指定Observable在Schedulers.io( )调度器的线程中,每隔1秒发射一次数据,通过subscribeOn(Schedulers.newThread())指定map操作符在Schedulers.newThread()的调度器线程中处理数据,通过observeOn(AndroidSchedulers.mainThread())指定Observer在Android UI线程中接收数据。

运行结果如下:

System.out:发射线程:RxCachedThreadScheduler-1---->发射:0System.out:处理线程:RxCachedThreadScheduler-1---->处理:0System.out:发射线程:RxCachedThreadScheduler-1---->发射:1System.out:接收线程:main---->接收:0System.out:处理线程:RxCachedThreadScheduler-1---->处理:1System.out:接收线程:main---->接收:1

我们发现发射和处理数据均是在RxCachedThreadScheduler线程中,第二次通过subscribeOn指定的线程不起作用。

示例三:使用一次subscribeOn和两次observeOn

schedulerDemo3.jpg

通过subscribeOn(Schedulers.io())指定Observable在Schedulers.io( )调度器的线程中,每隔1秒发射一次数据,通过observeOn(Schedulers.newThread())指定map操作符在Schedulers.newThread()的调度器线程中处理数据,通过observeOn(AndroidSchedulers.mainThread())指定Observer在Android UI线程中接收数据。

运行结果如下:

System.out:发射线程:RxCachedThreadScheduler-1---->发射:0System.out:发射线程:RxCachedThreadScheduler-1---->发射:1System.out:处理线程:RxNewThreadScheduler-1---->处理:0System.out:接收线程:main---->接收:0System.out:处理线程:RxNewThreadScheduler-1---->处理:1System.out:接收线程:main---->接收:1

与我们的预期结果一致

通过示例一二三,我们可以总结subscribeOn和observeOn的用法如下:

subscribeOn来指定对数据的处理运行在特定的线程调度器Scheduler上,直到遇到observeOn改变线程调度器若多次设定,则只有一次起作用。observeOn指定下游操作运行在特定的线程调度器Scheduler上。若多次设定,每次均起作用。

示例四:Schedulers.trampoline()

通过示例一二三我们可以发现,Observer处理数据相比于Observable发射的数据存在滞后的现象,Observable发射了两个数据,Observer才处理了一个,并不是Observable没发射一个,Observer就处理一个。

运行:

schedulerDemo4.jpg

通过Schedulers.trampoline()/设置观察者在当前线程中处理数据,并且故意延迟两秒后在处理

控制台打印如下:

System.out: 发射线程:RxCachedThreadScheduler-1---->发射:0System.out: 接收线程:RxCachedThreadScheduler-1---->接收:0System.out: 发射线程:RxCachedThreadScheduler-1---->发射:1System.out: 接收线程:RxCachedThreadScheduler-1---->接收:1System.out: 发射线程:RxCachedThreadScheduler-1---->发射:2System.out: 接收线程:RxCachedThreadScheduler-1---->接收:2System.out: 发射线程:RxCachedThreadScheduler-1---->发射:3System.out: 接收线程:RxCachedThreadScheduler-1---->接收:3System.out: 发射线程:RxCachedThreadScheduler-1---->发射:4System.out: 接收线程:RxCachedThreadScheduler-1---->接收:4

我们可以发现虽然Observer在接收到数据后,延迟了两秒才处理,但是Observable依然在Observer将数据处理完之后才开始发射下一条。Schedulers.trampoline()的作用在当前线程立即执行任务,如果当前线程有任务在执行,则会将其暂停,等插入进来的任务执行完之后,再将未完成的任务接着执行。

示例五:Schedulers.single()

schedulerDemo5.jpg

运行结果如下:

System.out: 发射线程:RxSingleScheduler-1---->发射:0System.out: 发射线程:RxSingleScheduler-1---->发射:1System.out: 发射线程:RxSingleScheduler-1---->发射:2System.out: 处理线程:RxSingleScheduler-1---->处理:0System.out: 处理线程:RxSingleScheduler-1---->处理:1System.out: 处理线程:RxSingleScheduler-1---->处理:2System.out: 接收线程:RxSingleScheduler-1---->接收:0System.out: 接收线程:RxSingleScheduler-1---->接收:1System.out: 接收线程:RxSingleScheduler-1---->接收:2

通过Schedulers.single()将数据的发射,处理,接收在Schedulers.single()的线程单例中排队执行,当此线程中有任务执行时,其他任务将会按照先进先出的顺序依次执行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容