我有自定义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上调用了两次
甚至可能吗?
答案 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并多次订阅并将值平面映射到您的需要,而不是将所有内容放在一个可流动的中,因为如果流中出现错误,则整个流可能不会再发出任何数据。