我对 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 个字典要加载。有没有办法重构它?
我想在下载完成后立即插入单个字典数据,并有一个重试机制,下载失败。我怎样才能做到这一点?
我认为在你的情况下最好使用 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()操作器
| 归档时间: |
|
| 查看次数: |
5755 次 |
| 最近记录: |