Rx java RxJava2:如何改进并行数据下载和缓存?

Rx java RxJava2:如何改进并行数据下载和缓存?,rx-java,rx-java2,Rx Java,Rx Java2,我正在努力通过RxJava2。我想知道我的解决方案是否可以接受,或者是否有改进的方法 用例 用户按下更新数据按钮 将显示一个对话框-请稍候 并行处理多个后端调用 一旦这些操作完成,数据就会保存在本地数据库中 在完成所有请求(后端调用和持久化)后,应取消该对话框 当前解决方案 我有几个完整表,如下所示: Completable organisationUnitCompletable = backendService.getOrganisationUnits() .doOnNext(data

我正在努力通过RxJava2。我想知道我的解决方案是否可以接受,或者是否有改进的方法

用例

  • 用户按下更新数据按钮
  • 将显示一个对话框-请稍候
  • 并行处理多个后端调用
  • 一旦这些操作完成,数据就会保存在本地数据库中
  • 在完成所有请求(后端调用和持久化)后,应取消该对话框
  • 当前解决方案

    我有几个
    完整表
    ,如下所示:

    Completable organisationUnitCompletable = backendService.getOrganisationUnits()
        .doOnNext(data -> organisationUnitDao.saveInTx(data))
        .ignoreElements()
        .subscribeOn(Schedulers.io());
    
    Completable locationCompletable = backendService.getLocations()
        .doOnNext(data -> locationDao.saveInTx(data))
        .ignoreElements()
        .subscribeOn(Schedulers.io());
    
    Completable prioritiesCompletable = backendService.getPriorities()
        .doOnNext(data -> priorityDao.saveInTx(data))
        .ignoreElements()
        .subscribeOn(Schedulers.io());
    
    private <T> Completable prepareCompletable(Function<Void, Observable<List<T>>> source, AbstractDao<T, Long> dao) {
    
        Completable orderTypeCompletable = source
                .doOnNext(data -> dao.saveInTx(data))
                .ignoreElements()
                .subscribeOn(Schedulers.io());
    }
    
    我通过添加到列表并使用
    merge
    运算符将它们打包为一个:

    List<Completable> compatibles = new ArrayList<>();
    compatibles.add(organisationUnitCompletable);
    compatibles.add(locationCompletable);
    compatibles.add(prioritiesCompletable);
    
    Completable.merge(compatibles)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(() -> {
         progressDialog.dismiss();
    });
    
    有没有办法将其提取到一种方法中?我试过这样的方法:

    Completable organisationUnitCompletable = backendService.getOrganisationUnits()
        .doOnNext(data -> organisationUnitDao.saveInTx(data))
        .ignoreElements()
        .subscribeOn(Schedulers.io());
    
    Completable locationCompletable = backendService.getLocations()
        .doOnNext(data -> locationDao.saveInTx(data))
        .ignoreElements()
        .subscribeOn(Schedulers.io());
    
    Completable prioritiesCompletable = backendService.getPriorities()
        .doOnNext(data -> priorityDao.saveInTx(data))
        .ignoreElements()
        .subscribeOn(Schedulers.io());
    
    private <T> Completable prepareCompletable(Function<Void, Observable<List<T>>> source, AbstractDao<T, Long> dao) {
    
        Completable orderTypeCompletable = source
                .doOnNext(data -> dao.saveInTx(data))
                .ignoreElements()
                .subscribeOn(Schedulers.io());
    }
    
    private Completable prepareCompletable(函数源,AbstractDao){
    Completable orderTypeCompletable=源
    .doOnNext(数据->dao.saveInTx(数据))
    .ignoreElements()
    .subscribeOn(Schedulers.io());
    }
    
    在这里,我将把可观察到的和刀放入。当然,它不会编译。它似乎需要比我已经拥有的更多的关于泛型的知识

    对不起,问题太长了,很难用几句话来解释整个用例

    我真的必须将subscribeOn(Schedulers.io())添加到每个Completable吗

    是的,但是在
    Completable.merge()之后不需要它

    有没有办法将其提取到一种方法中

    公共静态函数applyIgnore(){
    返回f->f.ignoreElements().subscribeOn(Schedulers.io());
    }
    Completable locationCompletable=backendService.getLocations()
    .doOnNext(数据->位置dao.saveInTx(数据))
    .to(applyIgnore());
    
    这是一个清晰的问题。谢谢