RxAndroid上传多个文件成功存入DB
RxAndroid upload multiple files and store success in DB
我有以下用例:
- 从数据库中获取实体列表
- 迭代所有实体并获取所有附加文件
- 迭代所有附加文件并将每个文件上传到服务器
- 如果实体的所有文件都上传成功,更新实体并存入数据库
- 如果所有实体都完成了return
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)
方法 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。我在这里做的是:
- 对于每个实体
- 对于此实体中的每个文件
- 上传图片
- 等待所有图片上传完成,然后将实体保存到数据库。
- 在不同的线程上订阅,以便可以并行处理所有实体。
我没有机会测试这个解决方案,因为我现在无法打开 AndroidStudio。请让我知道它是否有帮助或是否需要一些更改。
我有以下用例:
- 从数据库中获取实体列表
- 迭代所有实体并获取所有附加文件
- 迭代所有附加文件并将每个文件上传到服务器
- 如果实体的所有文件都上传成功,更新实体并存入数据库
- 如果所有实体都完成了return
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)
方法 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。我在这里做的是:
- 对于每个实体
- 对于此实体中的每个文件
- 上传图片
- 等待所有图片上传完成,然后将实体保存到数据库。
- 在不同的线程上订阅,以便可以并行处理所有实体。
我没有机会测试这个解决方案,因为我现在无法打开 AndroidStudio。请让我知道它是否有帮助或是否需要一些更改。