gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 01:04:19 26 4
gpt4 key购买 nike

我有以下用例:

  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
});

最佳答案

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

因为您已将其标记为 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。请让我知道它是否有帮助或是否需要一些更改。

关于android - RxAndroid上传多个文件成功存入DB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48464963/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com