2015-07-03 22 views
10

Tôi đã triển khai tệp tải lên Amazon S3 theo hướng dẫn của Amazon và tôi nhận thấy rằng quá chậm. Mất khoảng 10 giây để tải lên tệp png đơn giản khoảng 20kb.Tải tệp lên Amazon S3 từ Android chậm

Ban đầu tôi nghĩ rằng vấn đề có liên quan đến chủ đề và tôi đã triển khai AsyncTask để tải hình ảnh lên nhưng vấn đề vẫn còn đó. Sau đây là mã được sử dụng để tải lên hình ảnh.

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

Bất kỳ ý tưởng nào để giải quyết vấn đề này? Cảm ơn :)

+1

Bạn đo thời gian như thế nào? Tốc độ tải lên có thể khác nhau tùy thuộc vào chất lượng mạng. Nó cũng bị ảnh hưởng bởi điểm cuối mà bạn kết nối. Ví dụ, nếu bạn đang ở châu Âu và bạn tải lên một tập tin cho chúng tôi-đông-1 (US Virginia), nó có thể được làm chậm. Chọn điểm cuối gần nhất với bạn có thể tăng tốc độ. – Yangfan

+2

Hiện tại chúng tôi đang ở châu Âu và chúng tôi có trường hợp của chúng tôi ở Virginia. Có thể vấn đề là do sự thay đổi của khu vực, bởi vì mã được đăng thẳng về phía trước. Trong kế hoạch tương lai của chúng tôi, chúng tôi sẽ di chuyển các trường hợp của chúng tôi sang Ireland và chúng tôi sẽ kiểm tra xem sự cố vẫn tiếp diễn hay không. Tôi sẽ tiếp tục cập nhật – rdiaz82

+2

Bạn đã xem Amazon Route 53 chưa (https://aws.amazon.com/route53/)? Đó là một sản phẩm dựa trên DNS cho phép bạn định tuyến đến nguồn tài nguyên S3 hoặc AWS gần nhất có vị trí. – StephenG

Trả lời

4

này sẽ búa CPU của bạn

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

Hãy thử thêm Thread.sleep để cung cấp cho các chủ đề khác thời gian để chạy.

+1

Điểm tốt! Tôi thực hiện vòng lặp while theo tài liệu amazon S3, tôi sẽ thử với giải pháp của bạn và kiểm tra xem nó hoạt động như thế nào. Cảm ơn! – rdiaz82

+2

@frank là đúng, thậm chí amazon xác nhận nó, kiểm tra ở đây dưới đây "Làm thế nào để sử dụng TransferManager" phần. https://mobile.awsblog.com/post/Tx1V588RKX5XPQB/TransferManager-for-Android –

+1

Quá trình tải lên có thể kết thúc sớm hơn nhiều so với thanh tiến trình hiển thị, vì hệ thống đang bận xử lý nhiều thư trong hàng đợi xử lý. – Yangfan

Các vấn đề liên quan