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

时间:2016-06-11 09:05:33

标签: java android events rx-java rx-android

当您有一个外部事件告诉您应该从observable中自动检索新项目时,最好的方法是什么?

例如,假设我有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;
}

2 个答案:

答案 0 :(得分:2)

我认为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

答案 1 :(得分:0)

您应该使用主题。

检查出来。

Error in get(name, envir = envir) : object 'data.original' not found
Error in checkForRemoteErrors(val) : 
  one node produced an error: could not find function "elbow.k"

上面的代码将打印:

public class ExampleUnitTest {
    @Test
    public void testSample() throws Exception {
        ItemRepository itemRepository = new ItemRepository();

        itemRepository.getAllItems()
                .doOnNext(items -> System.out.println("Initializing emission..."))
                .flatMap(Observable::from)
                .subscribe(System.out::println);

        List<Item> items = new ArrayList<>();

        items.add(new Item("First"));
        items.add(new Item("Second"));

        itemRepository.publishNewItems(items);

        items.add(new Item("Third"));
        items.add(new Item("Fourth"));

        itemRepository.publishNewItems(items);
    }

    public class ItemRepository {
        private PublishSubject<List<Item>> itemsListSubject = PublishSubject.create();

        public Observable<List<Item>> getAllItems() {
            return itemsListSubject;
        }

        public void publishNewItems(List<Item> items) {
            itemsListSubject.onNext(items);
        }
    }

    public class Item {
        private String name;

        public Item(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return "Item{" +
                    "name='" + name + '\'' +
                    '}';
        }
    }
}

因此,您有一个可以随时发出项目列表的observable。

我建议您查看主题文档here

希望它有所帮助。

最好的问候。