如何解决使用适用于Android的AWS Amplify下载多个文件 使用香草放大具有Rx绑定并行运行许多下载报告错误
我正在构建一个Android应用,该应用使用AWS Amplify来列出和下载S3中的文件。
示例代码显示下载是异步的:
Amplify.Storage.downloadFile()
"ExampleKey",new File(getApplicationContext().getFilesDir() + "/download.txt"),result -> Log.i("MyAmplifyApp","Successfully downloaded: " + result.getFile().getName()),error -> Log.e("MyAmplifyApp","Download Failure",error)
);
我希望在后台线程中下载(可能很多)文件,并在下载完所有文件(或发生错误)后通知主线程。问题:
实现此功能的最佳方法是什么?
P.S。
我尝试过RxAmplify,它公开了RxJava我可以在其上调用的blockingSubscribe()
观察对象。但是,绑定是非常新的,使用它时,我遇到了一些导致应用崩溃的未捕获异常。
解决方法
使用香草放大
downloadFile()
将在后台线程上执行其工作。只需使用standard approaches中的一个从回调返回主线程即可:
Handler handler = new Handler(context.getMainLooper());
File file = new File(context.getFilesDir() + "/download.txt");
Amplify.Storage.downloadFile(
"ExampleKey",file,result -> {
handler.post(() -> {
Log.i("MyAmplifyApp","Successfully downloaded: " + result.getFile().getName());
});
},error -> Log.e("MyAmplifyApp","Download Failure",error)
);
具有Rx绑定
但就我个人而言,我将使用Rx绑定。 The official documentation包含Rx API的代码段。这是一个更具针对性的示例:
File file = new File(context.getFilesDir() + "/download.txt");
RxAmplify.Storage.downloadFile("ExampleKey",file)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(result -> {
Log.i("RxExample","Download OK.");
},failure -> {
Log.e("RxExample","Failed.",failure);
});
并行运行许多下载
通过调用Single
构建RxAmplify.Storage.downloadFile("key",local)
的集合。然后,使用Single.mergeArray(...)
合并它们。以与上述相同的方式订阅。
RxStorageCategoryBehavior storage = RxAmplify.Storage;
Single
.mergeArray(
storage.downloadFile("one",localOne)
.observeResult(),storage.downloadFile("two",localTwo)
.observeResult()
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(/* args ... */);
报告错误
您提到自己遇到了意外的异常。如果是这样,请提交一个错误here,我将对其进行修复。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。