RxAndroid上传多个文件并在DB中存储成功

问题描述 投票:2回答:1

我有以下用例:

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

我有一个实体列表。每个实体都附加了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
            });
android rx-java2 rx-android
1个回答
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. 在不同的线程上订阅,以便可以并行处理所有实体。

我没有机会测试这个解决方案,因为我现在无法打开AndroidStudio。如果有帮助或是否需要更改,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.