0°

RxJava的使用(四)线程控制 —— Scheduler

内容预览:
  • 所以之前的做法 因为是在主线程中发起的,所以不管中间map的处理还是Act...~
  • 不要把计算工作放在 io() 中,可以避免创建不必要的线程~
  • RxJava的使用十分灵活,想要对其熟悉使用只有一个办法,那就是多用啦,...~

始发于微信公众号: 程序员小乐

分享编程技能、互联网技术、生活感悟、打造干货分享平台,将总结的技术、心得、经验分享给大家,这里不只限于技术!学无止境,不求尽如人意,但求问心无愧。让学习成为一种美、一种习惯。值得爱学习的你去关注,感觉有帮助转发分享让更多的人去关注!点击上方 蓝字 关注!


每日英语

The broader than the sea, is the heart; the most beautiful is not the future, today. 

最宽广的不是大海,是人心;最美好的不是未来,是今天。


RxJava的使用(四)线程控制 —— Scheduler


前三篇 介绍了RxJava的基本用法,对Rxjava还不了解的请先看以上三篇。这篇为大家讲解RxJava线程控制 —— Scheduler的使用。


前言



经过前几篇的介绍,对RxJava对模式有了一定的理解:由Observable发起事件,经过中间的处理后由Observer消费。(对RxJava还不了解的可以出门左拐)

之前的代码中,事件的发起和消费都是在同一个线程中执行,也就是说之前我们使用的RxJava是同步的~~~

观察者模式本身的目的不就是后台处理,将处理结果回调给前台?这同步的是要哪样?所以,这篇为大家介绍RxJava的重要的概念——Scheduler


参考:给 Android 开发者的 RxJava 详解
(本文部分内容引用自该博客)



介绍



RxJava在不指定线程的情况下,发起时间和消费时间默认使用当前线程。所以之前的做法


RxJava的使用(四)线程控制 —— Scheduler


因为是在主线程中发起的,所以不管中间map的处理还是Action1的执行都是在主线程中进行的。若是map中有耗时的操作,这样会导致主线程拥塞,这并不是我们想看到的。


Scheduler



Scheduler:线程控制器,可以指定每一段代码在什么样的线程中执行。
模拟一个需求:新的线程发起事件,在主线程中消费

RxJava的使用(四)线程控制 —— Scheduler


上面用到了subscribeOn(),和observeOn()方法来指定发生的线程和消费的线程。


1.subscribeOn():指定subscribe() 所发生的线程,即Observable.OnSubscribe 被激活时所处的线程。或者叫做事件产生的线程。


2.observeOn():指定Subscriber 所运行在的线程。或者叫做事件消费的线程。


以及参数Scheduler,RxJava已经为我们提供了一下几个Scheduler


1.Schedulers.immediate():直接在当前线程运行,相当于不指定线程。这是默认的 Scheduler。


2.Schedulers.newThread():总是启用新线程,并在新线程执行操作。

Schedulers.io(): I/O 操作(读写文件、读写数据库、网络信息交互等)所使用的 Scheduler。行为模式和 newThread() 差不多,区别在于 io() 的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下 io() 比 newThread() 更有效率。不要把计算工作放在 io() 中,可以避免创建不必要的线程。


3.Schedulers.computation():计算所使用的 Scheduler。这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操作放在 computation() 中,否则 I/O 操作的等待时间会浪费 CPU。


4.AndroidSchedulers.mainThread():它指定的操作将在 Android 主线程运行。



多次切换线程



看完上面的介绍想必对RxJava线程的切换有了一些理解,上面只是对事件的发起和消费制定了线程。如果中间有map之类的操作呢?是否可以实现发起的线程在新线程中,map的处理在IO线程,最后的消费在主线程中。


RxJava的使用(四)线程控制 —— Scheduler



可以看到observeOn()被调用了两次,分别指定了map的处理的现场和消费事件show(s)的线程。



1.若将observeOn(AndroidSchedulers.mainThread())去掉会怎么样?不为消费事件show(s)指定线程后,show(s)会在那里执行?


2.其实,observeOn() 指定的是它之后的操作所在的线程。也就是说,map的处理和最后的消费事件show(s)都会在io线程中执行。

observeOn()可以多次使用,可以随意变换线程



小结



学会线程控制后才算是真正学会了使用RxJava。RxJava的使用十分灵活,想要对其熟悉使用只有一个办法,那就是多用啦,熟能生巧。


作者:带心情去旅行

链接: http://www.jianshu.com/p/ecfb9d68d2a2
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

RxJava的使用(四)线程控制 —— Scheduler—– 由   分享


如何您想进技术群和大牛们交流,关注公众号在后台回复 “加群” 即可

如果您觉得不错,请别忘了分享到您的朋友圈让更多的人看到!! 您的举手之劳,就是对我最好的支持,非常感谢!



RxJava的使用(四)线程控制 —— Scheduler

每日掏心话

想成为更好的自己,就去见识更大的世界,认识更多奇妙的人,汲取更广泛的知识。你不需要别人过多的称赞,因为你自己知道自己有多好。内心的强大,永远胜过外表的浮华。


RxJava的使用(四)线程控制 —— Scheduler


推荐阅读





小密圈
这里聚集了业界内的大牛,值得各位大牛的加入!


RxJava的使用(四)线程控制 —— Scheduler

看完本文有收获?请转发分享给更多人
关注「杨守乐」,提升编程技能

【QQ技术群】279126311 []
【QQ技术群】484572225 [未]



以上就是:RxJava的使用(四)线程控制 —— Scheduler 的全部内容。

本站部分内容来源于互联网和用户投稿,如有侵权请联系我们删除,谢谢。
Email:[email protected]


0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论