RxAndroid上传多个文件成功存入DB

RxAndroid upload multiple files and store success in DB

我有以下用例:

  1. 从数据库中获取实体列表
  2. 迭代所有实体并获取所有附加文件
  3. 迭代所有附加文件并将每个文件上传到服务器
  4. 如果实体的所有文件都上传成功,更新实体并存入数据库
  5. 如果所有实体都完成了returnonComlete()

我有一个实体列表。每个实体都附加了 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
            });

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

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

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. 在不同的线程上订阅,以便可以并行处理所有实体。

我没有机会测试这个解决方案,因为我现在无法打开 AndroidStudio。请让我知道它是否有帮助或是否需要一些更改。