RxJava:如何等待所有订阅完成?

Mar*_*ert 6 android rx-java

我对 rxJava 相当陌生,正在尝试自己的东西。如果我做得对,我想得到一些建议。

用例:在我的应用程序第一次运行时,在成功登录后,我必须下载几个字典并将其保存在本地数据库中,以便应用程序运行。用户必须等到下载过程完成。

当前解决方案:我正在使用带有 rxjava 适配器的改造 2 来获取数据。我使用zip operator将所有 Observable 捆绑成一个。在所有下载完成后,回调触发并开始保存到数据库中。

没有什么比一些代码更好的了:

Observable<List<OrderType>> orderTypesObservable = backendService.getOrderTypes();
Observable<List<OrderStatus>> orderStatusObservable = mockBackendService.getOrderStatuses();
Observable<List<Priority>> prioritiesObservable = backendService.getPriorities();

return Observable.zip(orderTypesObservable,
        orderStatusObservable,
        prioritiesObservable,
        (orderTypes, orderStatuses, priorities) -> {
            orderTypeDao.deleteAll();
            orderTypeDao.insertInTx(orderTypes);
            orderStatusDao.deleteAll();
            orderStatusDao.insertInTx(orderStatuses);
            priorityDao.deleteAll();
            priorityDao.insertInTx(priorities);

            return null;
        });
Run Code Online (Sandbox Code Playgroud)

问题

我应该使用 zip 运算符还是有更适合我的原因的运算符?

这样做似乎有点乱。这只是代码的一部分,我目前有 12 个字典要加载。有没有办法重构它?

我想在下载完成后立即插入单个字典数据,并有一个重试机制,下载失败。我怎样才能做到这一点?

Mak*_*dov 6

我认为在你的情况下最好使用 Completable,因为对你来说只重要任务的完成。

Completable getAndStoreOrderTypes = backendService.getOrderTypes()
    .doOnNext(types -> *store to db*)
    .toCompletable();

Completable getAndStoreOrderStatuses = backendService.getOrderStatuses()
    .doOnNext(statuses -> *store to db*)
    .toCompletable();

Completable getAndStoreOrderPriorities = backendService.getOrderPriorities()
    .doOnNext(priorities -> *store to db*)
    .toCompletable();

return Completable.merge(getAndStoreOrderTypes, 
                         getAndStoreOrderStatuses, 
                         getAndStoreOrderPriorities);
Run Code Online (Sandbox Code Playgroud)

如果您需要串行执行 - 使用Completable.concat()而不是merge()

下载失败时的重试机制

使用方便的retry()操作器