【问题标题】:Upload file to Amazon S3 from Android slow将文件从 Android 缓慢上传到 Amazon S3
【发布时间】:2015-09-21 01:14:41
【问题描述】:

我已按照 Amazon 指南将文件上传到 Amazon S3,但我注意到它太慢了。上传一个 20kb 左右的简单 png 文件大约需要 10 秒。

最初我以为问题与线程有关,我已经实现了一个 AsyncTask 来上传图像,但问题仍然存在。以下是用于上传图像的代码。

private class UploadFileTask extends AsyncTask<String, Integer, String> {
    String remotePath;
    String remoteFileName;
    File file;
    Context context;
    S3UploadInterface listener;


    public UploadFileTask(Context context,String remotePath,String remoteFileName, File file, S3UploadInterface listener){
        this.context=context;
        this.remotePath=remotePath;
        this.remoteFileName=remoteFileName;
        this.file=file;
        this.listener=listener;
    }

    protected String doInBackground(String... params) {
        credentialsProvider = new CognitoCachingCredentialsProvider(context,
                "MY_PRIVATE_CREDENTIAL",
                Regions.US_EAST_1);
        TransferManager transferManager = new TransferManager(credentialsProvider);
        Upload upload = transferManager.upload(remotePath, remoteFileName, file);
        TransferProgress transferred = upload.getProgress();
        while (!upload.isDone()) {
            try {
                publishProgress((int) transferred.getPercentTransferred());
            } catch (Exception e) {
                listener.uploadFailed(e);
            }
        }
        return "uploaded";
    }

    protected void onProgressUpdate(Integer... progress) {
        if (listener!=null)
            listener.currentUploadProgress(progress[0]);
    }

    protected void onPostExecute(String result) {
        if (listener!=null)
            listener.uploadCompleted();
    }
}

有解决这个问题的办法吗? 谢谢:)

【问题讨论】:

  • 你如何测量时间?上传速度可能因网络质量而异。它还受您连接到哪个端点的影响。例如,如果您在欧洲并且您将文件上传到 us-east-1(美国弗吉尼亚州),它可能会很慢。选择离您最近的端点可能会提高速度。
  • 目前我们在欧洲,我们在弗吉尼亚有我们的实例。也许问题是由于区域变化,因为发布的代码是直截了当的。在我们未来的计划中,我们会将我们的实例迁移到爱尔兰,我们将检查问题是否仍然存在。我会持续更新的
  • 您看过 Amazon Route 53 (aws.amazon.com/route53) 吗?它是一种基于 DNS 的产品,可让您根据位置路由到最近的可用 S3 或 AWS 资源。
  • 是的,在我们计划的架构中,我们希望实施 de Route 53 以提供更大的灵活性。

标签: android amazon-web-services amazon-s3


【解决方案1】:

这会影响你的 CPU

    while (!upload.isDone()) {
        try {
            publishProgress((int) transferred.getPercentTransferred());
        } catch (Exception e) {
            listener.uploadFailed(e);
        }
    }

尝试添加 Thread.sleep 让其他线程有时间运行。

【讨论】:

  • 好点!我按照亚马逊 S3 文档实现了 while 循环,我将尝试使用您的解决方案并检查它是如何工作的。谢谢!
  • @frank 是真的,甚至亚马逊也证实了这一点,请在下面的“如何使用 TransferManager”部分查看。 mobile.awsblog.com/post/Tx1V588RKX5XPQB/…
  • 上传可能比进度条显示的早得多,因为系统正忙于处理处理程序队列中的大量消息。
猜你喜欢
  • 2012-02-02
  • 2011-07-21
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
  • 2019-12-10
  • 2013-09-09
  • 2015-10-28
相关资源
最近更新 更多