Rx java RxJava:为什么订阅共享的可观察更改项

Rx java RxJava:为什么订阅共享的可观察更改项,rx-java,reactive-programming,rx-java2,Rx Java,Reactive Programming,Rx Java2,我偶然发现了一些我无法解释的令人困惑的行为。我从一个更大的rx链中提炼了下面的例子,所以不要惊讶我到底为什么要这么做。我只是想了解一下为什么会发生这种情况!:) 但是如果您注释stateChanges.subscribe(),则会突然丢失Request1,它只打印以下内容: received Request2 你能解释一下吗? 另外,我想知道,即使没有额外的subscribe()在正常情况下,share已经连接到requestStream,并且由于延迟订阅(requestStream),上述设

我偶然发现了一些我无法解释的令人困惑的行为。我从一个更大的rx链中提炼了下面的例子,所以不要惊讶我到底为什么要这么做。我只是想了解一下为什么会发生这种情况!:)

但是如果您注释
stateChanges.subscribe()
,则会突然丢失
Request1
,它只打印以下内容:

received Request2
你能解释一下吗?
另外,我想知道,即使没有额外的
subscribe()

在正常情况下,
share
已经连接到
requestStream
,并且由于
延迟订阅(requestStream)
,上述设置是否可以发出这两个项目,
share
requestStream
将Request1发送给它之前,获取它的第二个
Observer
。因此,
requestStream
有两个
Observer
s,将Request1发送到第一个会将另一个
Observer
添加到第二个消费者,即
共享
,因此,那里的最终订户获得Request1

在注释掉的情况下,
share
尚未连接到
requestStream
,因此
requestStream
只能通知
delaySubscription
<代码>延迟订阅触发
共享
,然后订阅
请求流
。但是,
PublishSubject
只向
Observer
s的当前快照发送项目,同时无法看到其第一个
onNext
添加了一个新的
Observer
。因此,Request1不会到达
println


PublishSubject
不处理中的这个角案例,因为它需要其
onNext
记住哪个
观察者已经收到当前项目,并在当前
观察者的集合发生变化时继续重试。这会增加内存和时间开销。

谢谢您的详细回答!我需要一些安静的时间来处理它。
received Request1
received Request2
received Request2