RxJava:如何启动任务以及何时完成另一项任务?

时间:2017-12-06 03:15:46

标签: android rx-java2

我正在尝试使用RxJava在Android中创建聊天应用程序。事件的顺序是这样的:

  • 用户编写邮件并按“发送”。
  • 包含(id,message,sender,...)的消息对象应首先存储在本地数据库中,因为我需要生成他的id并返回id为stablished的消息对象。
  • 一旦存储了消息对象,就已设置了id,我必须使用正确的方式发送该消息。

问题是我不确定如何使用RxJava编程,如何启动任务以及何时完成启动另一项任务?我已经读过关于运算符zip,空,以及when,skipuntil,flatmap的内容,但我不确定我需要哪些。我对RxJava很新。

我有这个方法:

public Observable<Boolean> sendMessage(Message message) {
    return Observable.unsafeCreate(new Observable.OnSubscribe<Boolean>()     {
        @Override
        public void call(Subscriber<? super Boolean> subscriber) {
            MessageEntity messageEntity = messageToMessageEntityMapper.map(message);
            messageRepository.saveMessage(messageEntity);
            chatHelper.sendMessage(messageEntity);
            subscriber.onNext(true);
        }
    });
}

saveMessage和sendMessage的实现:

public Observable<MessageEntity> saveMessage(MessageEntity messageEntity) {
    return messageCache.saveMessage(messageEntity);
}

public void sendMessage(MessageEntity messageEntity) {       
    chatConnection.sendMessage(message);
}

我希望sendMessage在saveMessage完成后执行并返回预期的对象。

1 个答案:

答案 0 :(得分:1)

您可以使用observable.map来消耗第一个observable的结果并执行第二个observable。

public Observable<Boolean> sendMessage(Message message{ 
  MessageEntity messageEntity = messageToMessageEntityMapper.map(message); 
  return messageRepository.saveMessage(messageEntity)
          .map( updatedMessage -> {
               chatHelper.sendMessage(updatedMessage );
               return Observable.just(true);
           });
 };

您还可以让sendMessage返回布尔值Observable,而不是从true方法明确返回map

如果不需要使用第一个observable中发出的项目,则可以使用Observable.merge代替sendMessage返回一个observable。