从Android上传文件到Amazon S3速度慢

10

我按照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();
    }
}

有什么想法解决这个问题吗? 谢谢 :)


2
你如何测量时间?上传速度可能会因网络质量而异。它也受连接的终端点的影响。例如,如果您在欧洲并将文件上传到us-east-1(美国弗吉尼亚州),速度可能会很慢。选择距离最近的终端点可能会增加速度。 - Yangfan
2
目前,我们正在欧洲,并且我们的实例位于弗吉尼亚。也许问题是由于地域更改导致的,因为发布的代码很简单明了。在我们未来的计划中,我们将迁移我们的实例到爱尔兰,并且我们会检查问题是否仍然存在。我会保持更新。 - rdiaz82
2
你看过Amazon Route 53(https://aws.amazon.com/route53/)吗?它是一种基于DNS的产品,可以根据位置将路由定向到最近可用的S3或AWS资源。 - StephenG
1
是的,在我们计划的架构中,我们想要实现Route 53以给我们更多的灵活性。 - rdiaz82
1个回答

4

这将会严重消耗你的CPU资源

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

尝试添加Thread.sleep以给其他线程运行的时间。

1
好的!我按照亚马逊S3文档实现了while循环,我会尝试您的解决方案并检查它的工作情况。谢谢! - rdiaz82
2
@frank是真的,即使亚马逊也证实了,下面在“How to Use TransferManager”部分进行检查。 https://mobile.awsblog.com/post/Tx1V588RKX5XPQB/TransferManager-for-Android - Zeeshan Saiyed
1
上传可能比进度条显示的要早得多,因为系统正在忙于处理处理程序队列中的大量消息。 - Yangfan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接