RxJava-无法访问可观察的';谁的订户?
我学会了在反应式编程中使用RxJava-无法访问可观察的';谁的订户?,java,monads,reactive-programming,rx-java,Java,Monads,Reactive Programming,Rx Java,我学会了在反应式编程中使用主题,尽管我发现它们非常方便。但我知道他们可能被滥用。因此,我尝试创建一个无限的可观察冷可观察通常一次与单个订户交互,即使您订阅了更多,它们也独立运行,并不需要真正了解彼此 另一方面,主体必须在自己接收多播事件时跟踪其订阅者 快速查看您的代码表明存在一些竞争条件和丢失通知的可能性。相反,您可以依赖BehaviorSubject,这是异步字的“反应属性”。让它存储当前不可变映射并处理订阅者: BehaviorSubject<ImmutableMap> bs =
主题
,尽管我发现它们非常方便。但我知道他们可能被滥用。因此,我尝试创建一个无限的可观察冷可观察通常一次与单个订户交互,即使您订阅了更多,它们也独立运行,并不需要真正了解彼此
另一方面,主体必须在自己接收多播事件时跟踪其订阅者
快速查看您的代码表明存在一些竞争条件和丢失通知的可能性。相反,您可以依赖BehaviorSubject
,这是异步字的“反应属性”。让它存储当前不可变映射并处理订阅者:
BehaviorSubject<ImmutableMap> bs = BehaviorSubject.create();
Subject<ImmutableMap, ImmutableMap> sync = bs.toSerialized();
forKey(k): bs.map(m -> m.get(k));
refresh(): sync.onNext(importFromDb());
BehaviorSubject bs=BehaviorSubject.create();
Subject sync=bs.toSerialized();
forKey(k):bs.map(m->m.get(k));
刷新():sync.onNext(importFromDb());
我没有足够的经验对你的问题给出一个恰当的答案,但是:1.)你可能会在CR上发现我的问题的答案很有趣:2.)你可能想看看源代码sqlbrite,特别是这个文件,它在内部使用主题来处理重新加载/触发:我怀疑可能存在种族条件。那么为什么人们经常说几乎不应该使用主题呢?就我的目的和你所展示的,它们在某些情况下似乎是合适的。这种“不要使用”的说法对我来说总是太苛刻了。我想说你应该首先寻找其他的方法,但是有一些用法预期暗示着主语的使用几乎是立即的。
BehaviorSubject<ImmutableMap> bs = BehaviorSubject.create();
Subject<ImmutableMap, ImmutableMap> sync = bs.toSerialized();
forKey(k): bs.map(m -> m.get(k));
refresh(): sync.onNext(importFromDb());