用多个订阅者调用一次流的一部分?

时间:2017-10-12 08:09:04

标签: android sockets kotlin rx-java rx-java2

我有自定义Rx适配器用于套接字通信。 在它之外我通过消息观察Flowable。 然后我有一个经理处理每条消息,然后再发出它。

       fun observeSocket() = socketManager
                .observe()
                .doOnNext{
                    insideMessageHandler.handle(it)
                }

然后我有两个订阅者执行observeSocket()。subscribe()

问题在于,每个消息insideMessageHandler.handle(it)都会被调用两次。我想找到流的一部分对每个订户都是通用的方式。不幸的是,在observeSocket()结尾处的.share()操作符不起作用。

我有两次这样的事情:

         /onNextInside
Flowable/-onNextOutsideSubscriber1
Flowable\-onNextOutsideSubscriber2
         \-onNextInside

我希望得到类似的东西:

         /-onNextInside
Flowable/-onNextOutsideSubscriber1
        \-onNextOutsideSubscriber2

在代码中它看起来像

insideManager.observeSocket().subscribe({do something first})
insideManager.observeSocket().subscribe({do something second})

问题是在这种情况下我在onNextInside上调用了两次

甚至可能吗?

2 个答案:

答案 0 :(得分:2)

问题在于重新创建了observable:

fun observeSocket() = socketManager
        .observe()
        .doOnNext{
            insideMessageHandler.handle(it)
        }

每次拨打observeSocket(),您都会创建一个新链,因此将share()放在那里就不会有所作为。

而是将此链定义为共享单例:

private val _observeSocket = socketManager
        .observe()
        .doOnNext{
            insideMessageHandler.handle(it)
        }
        .share()


fun observeSocket() = _observeSocket

答案 1 :(得分:0)

对于这种情况,你有主题。

var yourSubject = PublishSubject<Type>.create()
fun observeSocket() = socketManager.doOnNext(yourSubject::onNext)

然后你可以观察你的observeSocket()和另一个/多个用户。

如果你想共享一个Observable的发射,你可以使用share()运算符,这确保即使订阅了多个订阅者,它也只创建一个实例并使用

共享发出的数据
fun observeSocket() = socketManager
            .doOnNext(insideMessageHandler::handle)
            .share()

无论如何,为了这个目的,在doOnNext中为反应性东西平放/发射到另一个可观测量的东西并不是一个好的用法。

更好地共享一个Flowable并多次订阅并将值平面映射到您的需要,而不是将所有内容放在一个可流动的中,因为如果流中出现错误,则整个流可能不会再发出任何数据。