结合RxJava 2可观察量,其中一些可能永远不会发射

时间:2017-11-28 17:09:21

标签: java android rx-java2

我正在使用聊天客户端,需要合并来自两个不同Rx来源的数据:

  • 一个REST网关,用于获取可用聊天及其消息的初始列表:Observable<List<Conversation>> getConversations()
  • 一个websocket网关,它会在到达时发出新消息:Observable<Message> getMessages()

两个observable都应合并在一个Observable<ConversationsModel>中,其中ConversationsModel包含会话列表,并包含将消息添加到给定会话的逻辑。

组合的observable应该在每次observable发出时发出更新的ConversationsModel:在订阅时,REST observable发出一次并建立websocket连接。然后,应该通过套接字网关发送的任何新消息都会添加到模型中,然后重新发出。

这是我当前的解决方案,但我对它不满意,因为需要在流外创建ConversationsModel:

ConversationsModel conversations = new ConversationsModel();
conversationsObservable = restGateway.getConversations().map(list -> conversations.setConversations(list))
    .mergeWith(socketGateway.getMessages().map(message -> conversations.addMessage(message)))
    .doOnSubscribe(disposable -> socketGateway.connect())
    .doOnDispose(() -> socketGateway.disconnect())
    .replay(1)
    .refCount();

我正在寻找的东西是这样的:

conversationsObservable = restGateway.getConversations().map(list -> new ConversationsModel(list))
    .withLatestFrom(socketGateway.getMessages(), (conversationsModel, message) -> conversationsModel.addMessage(message))
    .doOnSubscribe(disposable -> socketGateway.connect())
    .doOnDispose(() -> socketGateway.disconnect())
    .replay(1)
    .refCount();

问题是withLatestFrom(以及我迄今为止尝试过的所有其他操作符)在所有可观测量至少发射一次之前不会发出任何内容。在实践中,这意味着我的UI将被阻塞,直到第一条消息通过套接字连接到达,这当然是不可接受的。

0 个答案:

没有答案