Rx java RxJava共享,新订户的最后一个值

Rx java RxJava共享,新订户的最后一个值,rx-java,Rx Java,我创建了一个可观察的,这是对行为主体进行大量功能转换的结果。现在我想分享可观察的值,这样就不会为每个新订户重新执行函数链。我还希望共享副本的行为与原始副本相同,即新到达的订阅者应该在订阅之后获得最后发出的值 在0.20.x中,可以将多播(subjectFactory).refCount()与行为主题的工厂一起使用,或者简单地使用共享(初始值),后者反过来使用行为主题而不是发布主题 如何在1.0.x中实现相同的行为?我认为您可以用replay(1.refCount()替换多播(behaviorSu

我创建了一个
可观察的
,这是对
行为主体
进行大量功能转换的结果。现在我想分享可观察的
值,这样就不会为每个新订户重新执行函数链。我还希望共享副本的行为与原始副本相同,即新到达的订阅者应该在订阅之后获得最后发出的值

0.20.x
中,可以将
多播(subjectFactory).refCount()
行为主题的工厂一起使用,或者简单地使用
共享(初始值)
,后者反过来使用
行为主题
而不是
发布主题


如何在
1.0.x
中实现相同的行为?

我认为您可以用
replay(1.refCount()
替换
多播(behaviorSubjectFactory).refCount()

为了使讨论更具体一点,下面是一个完整的示例(在Scala中):

@volatile var startTime:Long=0
def打印时间戳(s:字符串){
println(s“[t=${System.currentTimeMillis startTime}]$s”)
}
//为简单起见,假设UI事件只是一个小事件
//可观察到热定时器。
val uiEvents=可观测计时器(1000毫秒,1000毫秒)
.doOnEach(i=>打印时间戳(“生成”+i))
.出版
//现在应用所有转换
val transformed=uiEvents.map(i=>i+101)
.doOnEach(i=>打印时间戳(“转换为”+i))
//并设置默认的开始值
val o1=转换后的起始值(100)
//共享并确保新订阅者重播最后一个元素
//认购后立即:
val o2=o1.回放(1).参考计数
//startTime就在我们开始观察uiEvents之前
startTime=System.currentTimeMillis
val subscriptionIEvents=uiEvents.connect
线程。睡眠(500)
打印时间戳(“订阅A”)
val subscriptionA=o2.subscribe(i=>printTimestamped(“A got”+i))
《睡眠》(2000年)
打印时间戳(“订阅B”)
val subscriptionB=o2.subscribe(i=>printTimestamped(“B got”+i))
《睡眠》(2000年)
打印时间戳(“取消订阅B”)
订阅b.取消订阅()
《睡眠》(2000年)
打印时间戳(“取消订阅A”)
订阅a.取消订阅()
//现在转换将停止执行,但UI
//活动仍将制作
《睡眠》(2000年)
//最后,还要停止UI事件:
subscriptionUiEvents.unsubscribe()
输出:

[t=505]订阅
A得了100分
[t=1002]产生0
[t=1003]转换为101
[t=1003]A得到101
[t=2002]1
[t=2002]转化为102
[t=2002]A获得102分
[t=2520]订阅B
[t=2521]B得到102
[t=3003]生产2
[t=3003]转换为103
[t=3003]A获得103分
[t=3003]B得到103
[t=4002]生产3
[t=4002]转换为104
[t=4002]A得到104
[t=4002]B得到104
[t=4521]取消订阅B
[t=5003]生产4
[t=5003]转换为105
[t=5003]A得到105
[t=6002]生产5
[t=6002]转换为106
[t=6002]A获得106分
[t=6522]取消订阅
[t=7003]生产6
[t=8002]生产7

原始答案:

引述:

删除了任何采用初始值的方法重载,因为startWith运算符已经允许这样做


因此,不要使用
share(initialValue)
,只需使用
share().startWith(initialValue)

谢谢您的回答!但这种结构并没有达到预期的效果。基本上,我想在UI编程中使用RX来传递“当前状态”,所以每个新订户都应该立即接收当前状态并监听更多通知。您的建议是在通知前加上一些值,这些值是预先计算的,不反映“当前状态”。我明白了。更新了我的答案。谢谢,对我来说完全一样。我只是将.publish().refcount()替换为.replay(1).refcount(),以便在每次新的观察者订阅时获取最后一个已知值!