Observalbe的订阅与事件发送过程的关联
Cold Observalbes:多次订阅都重用同一个Observalbe对象,每次订阅都自动重演一次事件发送流程(并行启动多个独立事件发送流)
defer(Func0):每次订阅重建一个新Observalbe对象
cache:每次订阅都发送之前缓存的旧事件,不重演事件发送流程
Connectable Observables (Hot):多次订阅都重用同一个Observalbe对象,通过 connect 函数手动启动事件发送,每次订阅仅能接收订阅后发送的事件(仅启动单个事件发送流,不重演)
replay:多次订阅都重用同一个Observalbe对象,每次订阅都重放一次事件发送流程(缓存旧事件),允许通过附加参数指定缓存区大小(或有效时间窗口长度),相当于Cold Observalbes中的cache操作
Observable的Cold-Hot转化
publish:将Cold Observalbe转化为Connectable Observable
refCount:将Connectable Observable转化为Cold(伪) Observalbe(本质为自动引用计数,自动追踪维护新订阅者与源Connectable Observable的connect关系,但不改变单一事件发送流的实质,共享同一事件对象,且只能接收订阅后发送的事件,即变成单一事件发送流的Cold Observalbe,首单订阅发生时自动开始发送事件,最后一个订阅者失效时事件发送自动结束)
share:直接等于publish+refCount,将普通Cold Observable转化为单一事件发送流的Cold Observalbe,共享事件对象
难以理解的Join
join(targetObservable, leftTimer, rightTimer, resultFunc):源Observalbe与目标Observalbe发送的事件进行融合,成为新事件并发出。即带时效版本的combineLatest。leftTimer函数接收源Observalbe事件,并据此产生临时Observalbe<?>,以其生命周期长度作为源Observalbe的每个独立事件的有效缓存期,rightTimer函数则以相同方式作为目标Observalbe的事件有效缓存期,双方每次发送的事件时刻若落在对方最近一次事件的有效缓存期内,则取出双方事件,通过resultFunc<T1,T2,R>函数进行组合运算,得到本次实际发送的结果事件R。
groupJoin(targetObservable, leftTimer, rightTimer, resultFunc):与join相同,但resultFunc函数参数为源Observalbe的一个事件A,以及在该事件有效缓存期间,由目标Observalbe发送的事件序列构成的子集Observalbe<T2>(包括之前发出但有效缓存期抵达事件A发出时刻的历史缓存事件),并返回一个事件融合结果合集Observalbe<R>(通常可通过目标子集Observalbe.map()方法得到每个目标事件与事件A加成的结果合集)。该函数最后的所有结果合集Observalbe<R>所发送的所有事件将被抽出汇入主事件流(即订阅时,得到的事件类型为该函数的合集Observalbe单个事件类型R)。
debounce(Func1->Observable) 源Observable发射一个新事件的时候,如果上一个事件通过函数Func1产生的临时Observable未结束,则上次的事件将被抛弃。(事件仅在临时Observable结束一刻实际发出)
重启订阅
repeat,在源Observable发出onCompleted事件后触发重订阅。
retry,在源Observable发出onError事件后触发重订阅。
retryWhen(Func1<Observable<Throwable> errorOb, Observable notiOb>)
每次源Observable发出onError事件,都会重用errorOb对象并传入发送新的error实体,并重用notiOb据此error决定发送onNext或complete、error终止事件,据此行为决定是否重启源Observable订阅。通常errorOb.flatMap->Observable.just(null)就足够了。需要拒绝重试,可errorOb.flatMap->Observable.error(error)。
Blocking Observable
BlockingObservable是阻塞型的Observable类型,主要用于测试和demo试验,通常不适宜用于产品开发。(当产品开发依赖于阻塞类型过程时,通常意味着设计不当)
BlockingObservable的事件发送依赖于其阻塞方法的显式调用。