使用适用于Android的AWS Amplify下载多个文件

时间:2020-09-21 15:00:11

标签: android amazon-web-services aws-amplify

我正在构建一个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()观察对象。但是,绑定是非常新的,使用它时,我遇到了一些导致应用崩溃的未捕获异常。

1 个答案:

答案 0 :(得分:0)

使用香草放大

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,我将对其进行修复。