1.基础版的订阅者-被观察者模式
(1).与控件的事件监听相同,基础版的订阅者-被观察者模式中,被观察者对象中需持有订阅者的对象。如果没有绑定,订阅者为null,第一次的事件传递call不会被调用(可重构修改为传递,此时二次事件传递前需要判断订阅者是否为null);
(2).二次的事件传递,即事件从被观察者传递到订阅者,是需要手动传递的,不会自动传递,即是否传递的决定权及数据拦截修改的决定权在开发者手中;
(3).由以上原理及功能需求可知,call中的订阅者对象可能为源订阅对象,成为代理对象的需求之一是一对一的订阅关系升级为多对一的订阅关系。另,如果关系为一对一,则订阅者至多只有一个,多次订阅则会造成覆盖,即最后的订阅者才是最终有效的。
实际:源订阅对象为基层Subscriber时,call中的订阅者对象为源订阅对象的安全副本SafeSubscriber。
(4).关于触发时机,普通控件为订阅监听(或订阅保存监听者),状态(改变)触发;RxJava为订阅触发,立即触发,非状态改变下的强制触发,监听即触发。RxJava本做异步而用,是以数据(修改)触发为目的的。
控件状态触发的源是控件,数据修改触发的源是数据,前者是先改变,再触发;后者是先触发,再改变(当然可以选择不改变,不改变是权利,改变是目的)。总的来说,RxJava为链式异步库,做数据的发送与处理。
(5).关于多次订阅与多次发送消息。当 Observable 被订阅的时候,OnSubscribe 的 call() 方法会自动被调用,订阅即发送消息。被观察者支持被不同的,相同的观察者多次订阅(发送)。
2.onStart(): 这是 Subscriber 增加的方法。它会在 subscribe 刚开始,而事件还未发送之前被调用,可以用于做一些准备工作,例如数据的清零或重置。这是一个可选方法,默认情况下它的实现为空。需要注意的是,如果对准备工作的线程有要求(例如弹出一个显示进度的对话框,这必须在主线程执行), onStart() 就不适用了,因为它总是在 subscribe 所发生的线程被调用,而不能指定线程。要在指定的线程来做准备工作,可以使用 doOnSubscribe() 方法。
3.unsubscribe(): 这是 Subscriber 所实现的另一个接口 Subscription 的方法,用于取消订阅。在这个方法被调用后,Subscriber 将不再接收事件。一般在这个方法调用前,可以使用 isUnsubscribed() 先判断一下状态。 unsubscribe() 这个方法很重要,因为在subscribe() 之后, Observable 会持有 Subscriber 的引用,这个引用如果不能及时被释放,将有内存泄露的风险。所以最好保持一个原则:要在不再使用的时候尽快在合适的地方(例如 onPause() onStop() 等方法中)调用 unsubscribe() 来解除引用关系,以避免内存泄露的发生。
4.onCompleted(): 事件队列完结。RxJava 不仅把每个事件单独处理,还会把它们看做一个队列。RxJava 规定,当不会再有新的onNext() 发出时,需要触发 onCompleted() 方法作为标志。
5.关于SafeSubscriber,onCompleted中自动调用了unsubscribe,注意,此时的取消订阅是针对副本观察者的取消订阅。至于副本是否与源观察者为同一对象,则需要在创建观察者的时候确定。如创建
Subscriber基类,则不是同一对象,创建SafeSubscriber,则是同一对象,subscribe函数源码部分:
if (!(subscriber instanceof SafeSubscriber)) {
subscriber = new SafeSubscriber<T>(subscriber);
}
即观察者只要属于SafeSubscriber类型,onCompleted之后无需再调用unsubscribe
若观察者属于Subscriber基类型,onCompleted没有默认实现
6.关于同一被观察者被同一观察者多次订阅
源Subscriber :由于每次观察动作执行,观察者被强行改变(改为SafeSubscriber),故多次订阅正常执行
源SafeSubscriber:onCompleted调用之后,call能够多次被调用(发送),但观察者无法再收到数据。
故SafeSubscriber支持同源同察的多次订阅,只是要保证onCompleted在数据全部发送完后调用
7.create() 方法是 RxJava 最基本的创造事件序列的方法。基于这个方法, RxJava 还提供了一些方法用来快捷创建事件队列,例如:
just(T...): 将传入的参数依次发送出来。
事件序列:为自定义序列。组合成一个队列,可执行多个队列。一次call代表一个队列。
事件队列:不能自定义序列。为固化序列。总序列为(onStart),onNext...,onCompleted
可猜测,所有创建事件队列的函数都会最终调用源观察者的onCompleted(只要保证被观察者基类的订阅函数会被调用和onNext全部执行完后调用onCompleted),因为观察者都会被导向为安全观察者,安全观察者的onCompleted会调用源观察者的onCompleted.
观察者若为safe类型 :所有序列及队列的创建均不会调用源观察者的onStart
(被safe拦截了,safe中覆盖即可)
(SafeSubscriber类对除了onStart之外的其它函数均有对源观察者的桥接)
观察者若为非safe类型:所有序列及队列的创建会调用源观察者的onStart
8.结构中,观察者是被观察者接口的实现类
9.观察者模式本身的目的就是『后台处理,前台回调』的异步机制
10.在不指定线程的情况下, RxJava 遵循的是线程不变的原则,即:在哪个线程调用 subscribe(),就在哪个线程生产事件;在哪个线程生产事件,就在哪个线程消费事件。如果需要切换线程,就需要用到 Scheduler (调度器)。
11.如果两条订阅线的subscribeOn均在异线程中,则这两条线是并列执行的
subscribeOn:指定队列call在哪种线程中运行
(1).若call中有自定义序列,不会影响序列执行的线程。如自定义onNext序列,call异步时,onNext受 observeOn影响,不指定observeOn时,onNext执行在subscribeOn的线程中;observeOn为main时,onNext在main中执行
(2).同异步是相对的,eg.subscribeOn在异步,如果call首句为非序列方法,其后序列在main,则顺序执行;如果call首句为序列方法,其后自定义代码,序列在main,即线程转换的当口,转换句与下句为并列执行,不定前后(即可能序列先执行,也可能自定义代码先执行)
(3).observeOn具体控制onNext,onCompleted,onError的执行线程
(4).由于队列(call)先于序列(onNext)执行,当不指定observeOn时,序列在队列的线程中运行;也不指定subscribeOn时,队列和序列在subscribe函数的线程中运行。
observeOn :指定序列onNext,onCompleted,onError在哪种线程中运行
12.ActionX与FuncX
ActionX:X个输入值 (X>=0)
FuncX : X个输入值和1个返回值 (X>=1)
13.onStart()只能执行在 subscribe() 被调用时的线程
14.而与 Subscriber.onStart() 相对应的,有一个方法 Observable.doOnSubscribe() 。它和 Subscriber.onStart() 同样是在 subscribe()调用后而且在事件发送前执行,但区别在于它可以指定线程。默认情况下, doOnSubscribe() 执行在 subscribe() 发生的线程;而如果在 doOnSubscribe() 之后有 subscribeOn() 的话,它将执行在离它最近的 subscribeOn() 所指定的线程。
15.doOnNext:在subscribe之后,最终的序列执行前调用。用于二次处理数据或事件过程中的其它业务处理。近似于map.
16.flatMap:用于处理异步嵌套问题
共同学习,写下你的评论
评论加载中...
作者其他优质文章