[zhuan]Subject and Processor

Subject
Subject 是 Observable 的一个扩展,同时还实现了 Observer 接口。第一眼看上去可能有点奇怪,但是在有些场合下使用 Subject 将会非常便捷。他们可以像 Observer 一样接收事件,同时还可以像 Observable 一样把接收到的事件再发射出去。这种特性非常适合 Rx 中的接入点,当你的事件来至于 Rx 框架之外的代码的时候,你可以把这些数据先放到 Subject 中,然后再把 Subject转换为一个 Observable,就可以在 Rx 中使用它们了。你可以把 Subject 当做 Rx 中的 事件管道。

Subject 有两个参数类型:输入参数和输出参数。这样设计是为了抽象而不是应为使用 Subject 是为了转换数据类型。转换数据应该使用转换操作函数来完成,后面我们将介绍各种操作函数。

Subject 有各种不同的具体实现。下面将介绍一些非常重要的实现以及他们之间的区别。
PublishSubject
PublishSubject 是最直接的一个 Subject。当一个数据发射到 PublishSubject 中时,PublishSubject 将立刻把这个数据发射到订阅到该 subject 上的所有 subscriber 中。
ReplaySubject
ReplaySubject 可以缓存所有发射给他的数据。当一个新的订阅者订阅的时候,缓存的所有数据都会发射给这个订阅者。 由于使用了缓存,所以每个订阅者都会收到所以的数据:
不管是何时订阅的,每个订阅者都收到了所有的数据。
缓存所有的数据并不是一个十分理想的情况,如果 Observable 事件流运行很长时间,则缓存所有的数据会消耗很多内存。可以限制缓存数据的数量和时间。 ReplaySubject.createWithSize 限制缓存多少个数据;而 ReplaySubject.createWithTime 限制一个数据可以在缓存中保留多长时间
BehaviorSubject
BehaviorSubject 只保留最后一个值。 等同于限制 ReplaySubject 的个数为 1 的情况。在创建的时候可以指定一个初始值,这样可以确保党订阅者订阅的时候可以立刻收到一个值。
AsyncSubject
AsyncSubject 也缓存最后一个数据。区别是 AsyncSubject 只有当数据发送完成时(onCompleted 调用的时候)才发射这个缓存的最后一个数据。可以使用 AsyncSubject 发射一个数据并立刻结束。

Processor
Processor 和 Subject 的作用相同的,既是观察者,也是被观察者。Subject 不支持背压,是 RxJava 1.x 继承过来的,Processor 继承 FlowableProcessor,支持背压。

不要使用 Flowable 或 Observable 里的方法,这样会将 Processor 转成一个 Flowable 或 Observable,用 Processor 内部重写的 create。

自己控制在合适的时机发射什么值,是 complete,还是 error。

AsyncProcessor

不论何时订阅,都只发射最后一个数据,如果因为异常而终止,不会释放任何数据,但是会向 Observer 传递一个异常通知。

BehaviorProcessor

发射订阅之前的一个数据和订阅之后的全部数据。如果订阅之前没有值,可以使用默认值。

PublishProcessor

从哪里订阅就从哪里发射数据。

ReplayProcessor

无论何时订阅,都发射所有的数据。

SerializedProcessor

其它 Processor 不要在多线程上发射数据,如果确实要在多线程上使用,用这个 Processor 封装,可以保证在一个时刻只在一个线程上执行。

UnicastProcessor

只能有一个观察者。

// 发射 3
// val processor = AsyncProcessor.create()
// 发射 2,3
// val processor = BehaviorProcessor.create()
// 发射 3
// val processor = PublishProcessor.create()
// 发射 1,2,3
val processor = ReplayProcessor.create()

processor.onNext(1)
processor.onNext(2)
processor.subscribe({Log.e("RX", "$it")})
processor.onNext(3)
processor.onComplete()

https://blog.csdn.net/qq_27062249/article/details/53509184

https://www.jianshu.com/p/11c26c9c64c7

你可能感兴趣的:([zhuan]Subject and Processor)