java - 在没有事件总线的情况下触发事件时自动从 observable 获取项目

标签 java android events rx-java rx-android

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

例如,假设我有和 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/

相关文章:

java - build.properties 和 build.xml

java - Notepadv2 教程不工作 - "no notes yet",NoteEdit 类似乎没有被调用

android - 在后台使用服务在android中下载文件

Java Swing keyEvent 与 keyPressed/keyReleased - 不同的键代码?

javascript - node.js eventemitter 创建多个对象还是依赖参数?

java - 可以使用 OpsCenter 但不能使用 DevCenter 或通过 Java 连接到 Cassandra 集群

java - JUnit 5是否支持按字母顺序或其他类似功能执行测试方法?

Android:从 XML 项中获取属性值

安卓 ListView : scrollBy and touch event

python - Matplotlib basemap : Popup box