gpt4 book ai didi

java - RxJava- 无法访问 Observable 的订阅者?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:43:39 24 4
gpt4 key购买 nike

我学会了it is undesirable使用 Subjects在响应式(Reactive)编程中,尽管我发现它们非常方便。但我知道他们可能会被滥用。所以我试图创造一个无限的 Observable<ImmutableMap<Integer,ActionProfile>需要发布新的 ImmutableMap每次refresh()叫做。我还有一个 forKey()返回 Observable 的方法检索最新 ActionProfile匹配一个特定的键。

但是,我对订阅者的处理方式让人感觉有些不合时宜。如果 Observable 的生命是无限的,你必须在 Observable 的构造之外自己管理订阅者,我是正确的吗? Observable 是否维护其订阅者列表?或者这是我的责任,所以我可以调用他们 onNext()随时?

public final class ActionProfileManager {
private final Observable<ImmutableMap<Integer,ActionProfile>> actionProfiles;
private volatile ImmutableMap<Integer,ActionProfile> actionProfileMap;

//do I really need this?
private final CopyOnWriteArrayList<Subscriber<? super ImmutableMap<Integer,ActionProfile>>> subscribers = new CopyOnWriteArrayList<>();

private ActionProfileManager() {
this.actionProfiles = Observable.create(subscriber -> {
subscriber.onNext(actionProfileMap);
subscribers.add(subscriber); // is it up to me to capture the subscriber here or is it already saved somewhere for me?
});
}

public void refresh() {
actionProfileMap = importFromDb();
subscribers.forEach(s -> s.onNext(actionProfileMap));
}

public Observable<ActionProfile> forKey(int actionProfileId) {
return actionProfiles.map(m -> m.get(actionProfileId));
}
private ImmutableMap<Integer,ActionProfile> importFromDb() {
return ImmutableMap.of(); //import data here
}
}

最佳答案

Cold Observables 通常一次与单个订阅者交互,即使您订阅了它们,它们也会独立运行并且不需要真正了解彼此。

另一方面,当订阅者多播他们自己接收到的事件时,他们必须跟踪他们的订阅者。

快速查看您的代码表明存在一些竞争条件和丢失通知的可能性。您可以依赖 BehaviorSubject 代替它,它是异步词的“ react 性属性”。让它存储当前的不可变映射并处理订阅者:

BehaviorSubject<ImmutableMap> bs = BehaviorSubject.create();
Subject<ImmutableMap, ImmutableMap> sync = bs.toSerialized();

forKey(k): bs.map(m -> m.get(k));

refresh(): sync.onNext(importFromDb());

关于java - RxJava- 无法访问 Observable 的订阅者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30196465/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com