我一直在遇到我希望能够通过RxJava监听请求响应的情况。问题是我不知道如何设置Observable以便我正在监听事件并以正确的顺序在订阅上发送消息。我不想发送消息然后监听,因为如果线程被挂起或响应速度超快,我可能会错过它。这是我自己能想到的最接近的
connection.onReceivedMessage()
.doOnSubscribe(() -> connection.send(message))
.filter(message -> message.id == id)
... // do stuff
或
Observable.defer(() -> {
connection.send(message);
return connection.onReceivedMessage();
})... // do stuff
但是这些看起来仍然像我仍然可以发送消息而不是在听取响应。有没有其他人试图这样做?我觉得我真的想要一种afterCreate()。
答案 0 :(得分:1)
我不想发送消息然后监听因为,如果线程 被暂停或响应超快,我可能会错过它。
使用Subject
。 BehaviorSubject
(始终向最新订阅者发出最新的observable)或ReplySubject
(向新订阅者发出所有Observable
)。我不确定整个逻辑,但你可以有类似的东西:
public BehaviorSubject mMessageBehaviorSubject = BehaviorSubject.create();
private void sendMessage() {
connection.onReceivedMessage()
.doOnSubscribe(() -> connection.send(message))
.filter(message -> message.id == id)
.subscribe(mSubject::onNext, Throwable::printStackTrace);
}
public Observable<String> getMessageObservable() {
return mMessageBehaviorSubject.asObservable();
}
通过这种方式,您可以发送消息,无论何时您准备好收听,在这种情况下,您都会收到最新消息
答案 1 :(得分:0)
doOnSubscribe正是您所需要的,它是&#34; afterCreate&#34;你在找。在您的第一个示例中,第一条消息将在订阅后发送,此时Observable已准备好处理响应。
至于你的问题 - 是否有其他人试图这样做? - 回答是肯定的。我使用与第一个示例相同的技术来对某些代码进行rxify。