RxJava的操作符太多了,详细的各个操作符的解释可以直接看文档ReactiveX/RxJava文档中文版,这里记录一些操作符的注意。
1.doOnSubscribe()操作符和subscriber.onStart()
这两个方法都是在开始发送事件之前执行,subscriber.onStart()要优先doOnSubscribe()执行。这两个方法不同的地方在于onStart()是回调方法,而doOnSubscribe()是操作符。
相信大家在看给 Android 开发者的 RxJava 详解这篇文章的时候都看到了作者对这两个方法的介绍
onStart(): 这是 Subscriber增加的方法。它会在 subscribe 刚开始,而事件还未发送之前被调用,可以用于做一些准备工作,例如数据的清零或重置。这是一个可选方法,默认情况下它的实现为空。需要注意的是,如果对准备工作的线程有要求(例如弹出一个显示进度的对话框,这必须在主线程执行), onStart() 就不适用了,因为它总是在 subscribe 所发生的线程被调用,而不能指定线程。要在指定的线程来做准备工作,可以使用 doOnSubscribe()方法,具体可以在后面的文中看到。
而与 Subscriber.onStart()
相对应的,有一个方法 Observable.doOnSubscribe()。它和 Subscriber.onStart()同样是在 subscribe()调用后而且在事件发送前执行,但区别在于它可以指定线程。默认情况下, doOnSubscribe() 执行在 subscribe() 发生的线程;而如果在 doOnSubscribe()之后有 subscribeOn() 的话,它将执行在离它最近的 subscribeOn()
所指定的线程。
这是作者的介绍,这里主要说的是onStart()和doOnSubscribe()这两个方法执行的线程,我用的是目前最新版compile 'io.reactivex:rxandroid:1.2.1'
和compile 'io.reactivex:rxjava:1.1.6'
。经过本人的亲测,onStart()和doOnSubscribe()方法默认的执行线程为主线程,onStart()不可以指定线程,doOnSubscribe()可以通过subscribeOn()(放在doOnSubscribe的下面)指定线程。 具体代码就不贴了,大家可以自己尝试一下~
2.observeOn()和subscribeOn()使用和区别以及注意事项
- 下面提到的“操作”包括产生事件、用操作符操作事件以及最终的通过 subscriber 消费事件
- 只有第一subscribeOn() 起作用(所以多个 subscribeOn() 毛意义)
这个 subscribeOn() 控制从流程开始的第一个操作,直到遇到第一个 observeOn() - observeOn() 可以使用多次,每个 observeOn() 将导致一次线程切换(),这次切换开始于这次 observeOn() 的下一个操作
- 不论是 subscribeOn() 还是 observeOn(),每次线程切换如果不受到下一个 observeOn() 的干预,线程将不再改变,不会自动切换到其他线程
两篇关于observeOn()和subscribeOn()的文章:
迷之RxJava (三)update 2 —— subscribeOn 和 observeOn 的区别
[译]在正确的线程上观察
不定期更新......
网友评论