然后听取发送订阅与RxJava

时间:2017-02-07 16:00:00

标签: java android concurrency rx-java

我一直在遇到我希望能够通过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()。

2 个答案:

答案 0 :(得分:1)

  

我不想发送消息然后监听因为,如果线程   被暂停或响应超快,我可能会错过它。

使用SubjectBehaviorSubject(始终向最新订阅者发出最新的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。