RxAndroid在数据库中

时间:2018-01-26 15:59:48

标签: android rx-java2 rx-android

我有以下用例:

  1. 从数据库中获取实体列表
  2. 遍历所有实体并获取所有附加文件
  3. 迭代所有附加文件并将每个文件上传到服务器
  4. 如果成功上传了该实体的所有文件,请更新该实体并将其存储到数据库
  5. 如果所有实体都已完成,请返回onComlete()
  6. 我有一个实体列表。每个实体都附加了0..n个文件。如果上传了实体的所有文件,我想上传每个文件并将其存储为成功。

    目前我这样做:

    Observable.fromIterable(entities)
                    .flatMap(entity -> {
                                //create a list of executable observables
                                List<Observable> tasks = new ArrayList<>();
                                // get all files of the entity
                                List<File> files = entity.getFiles();
    
                                // iterate through all files and upload the file. If successful -> store entity
                                files.forEach(file -> tasks.add(uploadImage(file)
                                        .doOnComplete(() -> {
                                            entity.update(entity.setUploaeded(true));
                                            repository.store(entity);
                                        })
                                ));
    

    这是我的whenAll方法:

    private Observable whenAll(List<Observable> tasks) {
    return Observable.fromIterable(tasks)
            .flatMap(task -> task.observeOn(Schedulers.computation()));
    }
    

    我想删除辅助方法whenAll。这可能吗?以下是它的样子:

    Observable.fromIterable(entities)
                .flatMapIterable(entity -> {
                    List<File> files = entity.getFiles();
                    return files;
                })
                .flatMap(file -> uploadImage(file))
                .doOnComplete(() -> {
                    // TODO: update entity and store it
                });
    

1 个答案:

答案 0 :(得分:1)

您提供的潜在解决方案并非完全可能,因为当您将实体映射到文件时,您将丢失有关下游实体的信息。

由于您已将此标记为RxJava2,因此我将使用Completables。我假设uploadImage(file)方法返回Complete(如果不能,则可以轻松转换它)。您的问题的解决方案可能如下所示:

Observable.fromIterable(entities)
    .flatMapCompletable(entity-> 
          Observable.fromIterable(entity.getFiles())
              .flatMapCompletable(this::uploadImage)
              .doOnComplete(() ->{                                      
                   entity.update(entity.setUploaeded(true));
                   repository.store(entity);
              }).subscribeOn(Schedulers.computation()))

因此,您还将获得Completable。我在这里做的是:

  1. 对于每个实体
  2. 对于此实体中的每个文件
  3. 上传图片
  4. 等待上传所有图像,然后将实体保存到数据库。
  5. 在不同的主题上订阅,以便可以并行处理所有实体。
  6. 我没有机会测试这个解决方案,因为我现在无法打开AndroidStudio。如果有帮助或是否需要进行一些更改,请告诉我。