gpt4 book ai didi

java - 在没有事件总线的情况下触发事件时自动从可观察对象中获取项目

转载 作者:搜寻专家 更新时间:2023-11-01 07:49:15 28 4
gpt4 key购买 nike

当您有一个外部事件告诉您应该这样做时,从可观察对象中自动检索新项目的最佳方法是什么?

例如,假设我有 ItemRepository它实现了一个 getAllItems()方法(从 Web 服务返回 Observable<List<Item>>),然后外部事件(如推送通知)告诉我的应用程序需要刷新数据。 (ItemRepository 也用在 Presenter 中,演示者调用了 getAllItems 并且在它的 onNext 上,它的数据被刷新。)

我知道这可以通过事件总线轻松完成(监听该事件,当它被触发时,再次获取),但我只是想知道是否有可能完全自动完成。

谢谢。

编辑

这是我在 SQLBrite 库的帮助下提出的解决方案,但不确定它是否是最好或最干净的方法。我们有一个 PublishSubject,事件被发送到:

PublishSubject<Object> updateEvent;

在 getAllItems() 方法中,我们检查来自该主题的事件:

public Observable<List<Item>> getAll() {
Observable.OnSubscribe<List<Item>> subscribe = subscriber -> {
updateEvent.subscribe(s -> {
subscriber.onNext(dbItemRepository.getAll());
});
subscriber.onNext(dbItemRepository.getAll());// for the first call
};
final Observable<List<Item>> automatonObservable = Observable.create(subscribe) =
.onBackpressureLatest()
.observeOn(Schedulers.computation())
.onBackpressureLatest();
return automatonObservable;
}

最佳答案

我认为 Rodrigo Henriques 的想法是正确的,但我们需要根据您的问题稍微修改一下:

public static Observable<String> observeRepositoryUpdates(ItemsRepository repo, Observable<Void> updateTrigger) {
updateTrigger
//you can insert observeOn here
.flatMap(event -> repository.getAllItems());
}

public static void doWork() {
ItemsRepository repo = new ItemsRepository();
PublishSubject<Void> updateTrigger = PublishSubject.create();

observeRepositoryUpdates(repo, updateTrigger)
.subscribe(items -> System.out.println(items.toString());

updateTrigger.onNext(null);//trigger update
}

根据您的事件,它不一定是 PublishSubject,任何其他可观察对象都可以触发存储库更新。

如果您的事件频繁发生并且您想放弃已经运行的存储库更新并开始新的更新,您可以使用运算符 switchMap .

关于java - 在没有事件总线的情况下触发事件时自动从可观察对象中获取项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37761937/

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