创建一个避免多次调用的公共observable

时间:2017-11-03 16:31:03

标签: java android kotlin rx-java reactive-programming

我有一个读取/写入消息的方法。

fun sendMessage(message: String): Observable<MESSAGE> {
    return readMessage().doOnSubscribe {
             socket.write(message)     
    }
}

readMessage()返回一个发布主题,该主题从流(socket.read())中的热观察值中发出值。

protected fun readMessage(): Observable<MESSAGE> {
    if (messageSubject == null) {
        messageSubject = PublishSubject.create()
        socket.read()
                .flatMap {
                    return@flatMap flowTransformer.runLoop(it)
                }
                .flatMap {
                    //Do some stuff
                }
                .subscribe(messageSubject)
    }
    return messageSubject
}

我在同一个链中的不同点和多次呼叫sendMessage()

       sendMessage("Message1").flatMap { 
        sendMessage("Message2")
    }.flatMap { 
        sendMessage("Message 3")
    }.subscribe({
        //next
    }, {
        //error
    })

问题是当我拨打sendMessage()时,我可能还没有订阅发布者(因此消息响应被丢弃)。我担心如果我使用ReplaySubject会发出太多消息,因为我使用了很多sendMessage()

有些时候,readObservable从第一个sendMessage读取所有下一条消息。这是一个问题,因为解析操作是CPU密集型的。

我怎样才能改善这条链?

1 个答案:

答案 0 :(得分:0)

您可以使用缓冲区大小

创建PublishSubject
public void ReplaySubjectBufferExample()
{
  var bufferSize = 2;
  var subject = new ReplaySubject<string>(bufferSize);
  subject.OnNext("a");
  subject.OnNext("b");
  subject.OnNext("c");
  subject.Subscribe(Console.WriteLine);
  subject.OnNext("d");
}

因此,通过这种方式,您可以控制要重播的项目数。 来源ReplaySubject