听录音,然后用RxJava订阅发送

听录音,然后用RxJava订阅发送,java,android,concurrency,rx-java,Java,Android,Concurrency,Rx Java,我经常遇到这样的情况:我希望能够通过RxJava监听对请求的响应。问题是,我不确定如何设置Observable,以便监听事件并以正确的顺序在subscribe上发送消息。我不想先发送消息,然后再收听,因为如果线程挂起或响应速度过快,我可能会错过它。这是我能想到的最接近我自己的 connection.onReceivedMessage() .doOnSubscribe(() -> connection.send(message)) .filter(me

我经常遇到这样的情况:我希望能够通过RxJava监听对请求的响应。问题是,我不确定如何设置Observable,以便监听事件并以正确的顺序在subscribe上发送消息。我不想先发送消息,然后再收听,因为如果线程挂起或响应速度过快,我可能会错过它。这是我能想到的最接近我自己的

connection.onReceivedMessage()
          .doOnSubscribe(() -> connection.send(message))
          .filter(message -> message.id == id)
          ... // do stuff

但这些看起来仍然像我仍然可以发送信息,而不是倾听回应。还有其他人试过这样做吗?我觉得我真的需要一种后创建()

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

使用
主题
BehaviorSubject
(始终向新订阅者发出最新的可观察对象)或
ReplySubject
(向新订阅者发出所有
可观察对象
)。我不确定整个逻辑,但你可以有这样的想法:

 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();
}
public BehaviorSubject mMessageBehaviorSubject=BehaviorSubject.create();
私有void sendMessage(){
connection.onReceivedMessage()的连接
.doOnSubscribe(()->connection.send(message))
.filter(message->message.id==id)
.subscribe(mSubject::onNext,Throwable::printStackTrace);
}
公共可观察getMessageObservable(){
返回mMessageBehaviorSubject.asObservable();
}

通过这种方式,您可以发送消息,并且无论何时您准备好收听,您都会收到最新发送的消息。在这种情况下,doOnSubscribe正是您所需要的,它是您正在寻找的“后创建”。在您的第一个示例中,第一条消息将在订阅后发送,此时可观察对象已经准备好处理响应


至于你的问题——还有其他人试过这样做吗答案是肯定的。我使用与您的第一个示例相同的技术来解析一些代码

doOnSubscribe就是这样工作的?我将不得不对这个进行更多的测试。我承认我从未做过单元测试来验证。
 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();
}