主题是一种在某些 ReactiveX 实现中可用的桥梁或代理,它既充当观察者又充当可观察对象。由于它是一个观察者,它可以订阅一个或多个可观察对象,并且由于它是一个可观察对象,它可以通过重新发射来传递它观察到的项目,并且它还可以发射新的项目。
由于主题订阅了可观察对象,它将触发该可观察对象开始发射项目(如果该可观察对象是“冷的”——也就是说,如果它在开始发射项目之前等待订阅)。这可能会使生成的主题成为原始“冷”可观察对象的“热”可观察对象变体。
在大多数 ReactiveX 实现中,特别是那些可以在多线程环境中运行的实现中,主题在其观察者方面不被认为是线程安全的。但是,可观察对象端,即 Subscribe()
始终是线程安全的。
这意味着从多个线程调用 OnNext
、OnError
或 OnCompleted
会导致未定义的状态。
因此,大多数 ReactiveX 实现提供了一个特殊的运算符,它也使观察者方面线程安全。查找 ToSerialized
运算符。
有四种类型的 主题
为特定用例而设计。并非所有这些都在所有实现中都可用,并且某些实现使用其他命名约定(例如,在 RxScala 中,这里称为“PublishSubject”的主题被称为“Subject”)。
在某些 ReactiveX 风格和版本中,例如 RxJava 3.x,有两种额外的主题类型可用,它们可以满足一些额外的常见角色。
待定
待定
如果您有一个 主题
并且您想将它传递给其他代理而不暴露其 Subscriber
接口,您可以通过调用它的 asObservable
方法来掩盖它,该方法将返回主题作为纯 Observable
。
AsyncSubject
BehaviorSubject
PublishSubject
ReplaySubject
如果您有一个 主题
并且您想将它传递给其他代理而不暴露其 Subscriber
接口,您可以通过调用它的 asObservable
方法来掩盖它,该方法将返回主题作为纯 Observable
。
AsyncSubject
BehaviorSubject
PublishSubject
ReplaySubject
如果您有一个 主题
并且您想将它传递给其他代理而不暴露其 Observer
接口,您可以通过调用它的 hide
方法来掩盖它,该方法将返回主题作为纯 Observable
。
AsyncSubject
BehaviorSubject
PublishSubject
ReplaySubject
UnicastSubject
CompletableSubject
MaybeSubject
SingleSubject
待定
待定
AsyncSubject
BehaviorSubject
ReplaySubject
待定
待定
待定