RxJava Relay vs Subjects

FRR*_*FRR 15 rx-java2

我试图通过Jake Warthon了解这个库的目的:https: //github.com/JakeWharton/RxRelay

基本上:除了无法调用onComplete或onError之外的主题.主体以有害的方式处于有状态:当它们收到onComplete或onError时,它们不再可用于移动数据.

我知道,这是一个有效的用例,但上面似乎很容易实现只使用现有的主题.

1.不要向主题转发errors/ completions事件:

`observable.subscribe({ subject.onNext(it) }, { log error / throw exception },{ ... })`
Run Code Online (Sandbox Code Playgroud)

2.不要暴露主题,使你的方法签名返回一个可观察的.

fun(): Observable<> { return subject }

我显然在这里遗漏了一些东西,我很好奇它是什么!

class MyPublishRelay<I> : Consumer<I> {

    private val subject: Subject<I> = PublishSubject.create<I>()

    override fun accept(intent: I) = subject.onNext(intent)

    fun subscribe(): Disposable = subject.subscribe()
    fun subscribe(c: Consumer<in I>): Disposable = subject.subscribe(c)
    //.. OTHER SUBSCRIBE OVERLOADS
}
Run Code Online (Sandbox Code Playgroud)

aka*_*okd 8

subscribe有超载,通常,人们习惯了subscribe(Consumer)过载.然后他们使用主题并且突然onComplete也被调用.RxRelay将用户从自己身上移除,而不考虑subscribe(Consumer)和之间的区别subscribe(Observer).

  1. 不要将错误/完成事件转发给主题:

实际上,但根据我们对初学者的经验,他们通常不会考虑这个问题,甚至不了解可用的方法.

  1. 不要暴露主题,使您的方法签名返回一个可观察的.

如果您需要一种方法将项目发送到主题,这不起作用.目的是使用主题来执行项目多播,有时来自另一个Observable.如果你通过它完全控制排放Subject,你应该有不打电话的体面,onComplete也不要让其他任何事情做.