带有FlowableEmitter的多重Flowable

时间:2018-09-13 21:54:34

标签: android websocket rx-java2 rx-android okhttp

我正在创建一个WebSocket类来接收一些数据,并且试图将Flowable与FlowableEmitter一起使用来接收套接字响应。

我想保留发射器,并且每次接收到onNext调用的数据并处理结果时,如果我在每个flowable中都进行订阅,则可以正常工作,但是如果我在以后使用FlatMap发送另一条消息,则无法工作第一个可流动的接收数据。

我创建一个发射器列表:

var listEmitter: MutableList<FlowableEmitter<*>> = mutableListOf()

然后我创建一个函数来注册观察者:

inline fun <reified T> onMessage(data: ByteString?): Flowable<T> {
    return Flowable.create<T>({ emitter ->
        listEmitter.add(emitter)
        //send the data to socket
        data?.let { socket?.send(data) }
    }, BackpressureStrategy.LATEST)
}

当我从套接字接收数据时,我打电话:

//I called [0] here to demonstrate the logic only
((listEmitter[0].subscriber) as FlowableEmitter<Any>).onNext(true)

在演示者中,我尝试做类似的事情:

socket
    .onMessage(/*some ByteString*/)
    .flatMap {
        if (it) {
            socket.onMessage(/*other data*/)
        } else {
            Flowable.just(false)
        }
    }.flatMap {
        if (it) {
            socket.onMessage(/*other data*/)
        } else {
            Flowable.just(false)
        }
    }.subscribe { /* do some stuff */}

因此只有第一个FlatMap被触发,第二个和第三个不再触发,我在正确的发射器上调用onNext,但是什么也没发生,调用了onNext,不调用FlatMap。

我在“ onMessage”上发送的数据具有标识符,因此在WebSocketConnection中,我知道正确的发射器,但为简单起见,我在这里没有这样做

我不确定为什么不起作用,也不知道如何存档。我只想在第一个收到结果后才发送onMessage。

0 个答案:

没有答案