您的位置:首页 > 编程语言 > Java开发

RXJava——线程控制:Scheduler (二)

2016-06-28 10:01 204 查看
原文链接:http://gank.io/post/560e15be2dca930e00da1083

除了灵活的变换,RxJava 另一个牛逼的地方,就是线程的自由控制。

1) Scheduler 的 API (二)
前面讲到了,可以利用
subscribeOn()
结合
observeOn()
来实现线程控制,让事件的产生和消费发生在不同的线程。可是在了解了
map()
flatMap()
等变换方法后,有些好事的(其实就是当初刚接触 RxJava 时的我)就问了:能不能多切换几次线程?

答案是:能。因为
observeOn()
指定的是
Subscriber
的线程,而这个
Subscriber
并不是(严格说应该为『不一定是』,但这里不妨理解为『不是』)
subscribe()
参数中的
Subscriber
,而是
observeOn()
执行时的当前
Observable
所对应的
Subscriber
,即它的直接下级
Subscriber
。换句话说,
observeOn()
指定的是它之后的操作所在的线程。因此如果有多次切换线程的需求,只要在每个想要切换线程的位置调用一次
observeOn()
即可。上代码:

Observable.just(1, 2, 3, 4) // IO 线程,由 subscribeOn() 指定
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.newThread())
.map(mapOperator) // 新线程,由 observeOn() 指定
.observeOn(Schedulers.io())
.map(mapOperator2) // IO 线程,由 observeOn() 指定
.observeOn(AndroidSchedulers.mainThread)
.subscribe(subscriber);  // Android 主线程,由 observeOn() 指定

如上,通过
observeOn()
的多次调用,程序实现了线程的多次切换。

不过,不同于
observeOn()
subscribeOn()
的位置放在哪里都可以,但它是只能调用一次的。

又有好事的(其实还是当初的我)问了:如果我非要调用多次
subscribeOn()
呢?会有什么效果?

这个问题先放着,我们还是从 RxJava 线程控制的原理说起吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: