当您有外部事件告诉您应该自动检索新项目时,从可观察对象中自动检索新项目的最佳方法是什么?
例如,假设我有和 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 - 在没有事件总线的情况下触发事件时自动从 observable 获取项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37761937/