2016-05-15 23 views
0

Ich habe Probleme beim Hochladen von Dateien in Amazon S3. Um den Status der hochgeladenen Datei zu verfolgen, verwende ich TransferListener zusätzlich zu transferUtility. Genaues Problem ist, dass die Methode onProgressChanged manchmal überhaupt nicht aufgerufen wird. Und manchmal funktioniert es gut. Ich habe festgestellt, dass das Problem auftritt, wenn ich versuche, größere Dateien hochzuladen. Also hier ist, wie ich es versucht habe.Transferutility in Aws sdk

Code:

 @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 

     Log.d("ID VALUE",String.valueOf(this.ID)); 

     if(sS3Client!=null&&this.ID==-1){ 

      Log.d("ID","InItial setup"); 

      sTransferUtility = new TransferUtility(sS3Client, this.ctx); 

      observer = sTransferUtility.upload(remotepath, file.getName(), file); 


      observer.setTransferListener(new UploadListener(this.progressBar,observer,file.getPath())); 
      observerlist.add(observer); 
     } 

    } 

und UploadListener:

private class UploadListener implements TransferListener{ 

    private ProgressBar progress; 
    private TransferObserver localobserver; 

    private int value; 
    private String file; 
    private DBoperations DB; 

    private ContentValues CV; 

    private ContentValues CV2; 

    private UploadListener(ProgressBar progressBar,TransferObserver observer,String file){ 
     this.progress=progressBar; 
     this.localobserver=observer; 
     this.file=file; 
     DB = new DBoperations(getContext()); 
    } 
    @Override 
    public void onStateChanged(int i, TransferState transferState) { 


     switch (transferState.toString()) { 
      case "IN_PROGRESS": 
      { 
       CV = new ContentValues(); 
       CV2= new ContentValues(); 

       Log.d("FILE UPLOAD","IN_PROGRESS"); 
       CV.put(DBconstants.TableConstants.F_FILE_STATUS, constants.UPLOADING); 

       DB.updateInformation(DB, DBconstants.TableConstants.TABLE_FILES, CV, DBconstants.TableConstants.F_LOCAL_PATH, this.file); 

       CV2.put(DBconstants.TableConstants.UPLOAD_ID, i); 
       DB.updateInformation(DB, DBconstants.TableConstants.TABLE_FILES, CV2, DBconstants.TableConstants.F_LOCAL_PATH, this.file); 

      } 
      break; 
      case "COMPLETED": 
      { 
       CV= new ContentValues(); 

       Log.d("FILE UPLOAD","COMPLETED"); 
       CV.put(DBconstants.TableConstants.F_FILE_STATUS, constants.UPLOADED); 

       DB.updateInformation(DB, DBconstants.TableConstants.TABLE_FILES,CV, DBconstants.TableConstants.F_LOCAL_PATH,this.file); 


      } 
      break; 

     } 
    } 
    @Override 
    public void onProgressChanged(int i, long l, long l1) { 
     updator(); 
     progress.setIndeterminate(false); 
     progress.setProgress(value); 
     Log.d(String.valueOf(i),String.valueOf(value)); 
    } 

    @Override 
    public void onError(int i, Exception e) { 

    } 
    private void updator() 
    { 
     value = (int) ((double) localobserver.getBytesTransferred() * 100/localobserver 
       .getBytesTotal()); 

    } 
} 

Wie dieses Problem zu lösen?

Was sind die besten Praktiken, um diese Art von Problemen zu vermeiden?

UPDATE:

Hier 84 ist meine Datei-ID. 0 ist die Anzahl der Bytes transferrred.I dies in logcat in onProgressChanged Verfahren gedruckt

05-15 17:24:56.640 22043-6710/? D/UploadTask: multipart upload 84 in 22 parts. 

05-15 17:24:56.649 22043-22043/? D/84: 0 

Antwort

1

nicht sicher, welche Version Sie verwenden. Es gibt einen bekannten Fehler in Version 2.2.15, bei dem Socket-Timeout nicht korrekt gemeldet wird. Bitte rüste auf Version 2.2.16 auf. Bei weiteren Fragen öffnen Sie bitte ein Problem unter https://github.com/aws/aws-sdk-android.

+0

Ich benutze 2.2.15. – sandesh

+0

behebt ein Upgrade auf 2.2.16 mein Problem? – sandesh

+0

In der Theorie ja. Andernfalls öffne bitte eine neue Ausgabe auf Github. – Yangfan

0

Ab sofort verfügen wir nicht über die Funktion zum erneuten Hochladen großer Dateien mit AWS SDK. Sie können jedoch versuchen, die großen Dateien in mehrere Teile mit kleineren Größen zu zerlegen und sie einzeln hochzuladen und neu zu assemblieren sie, sobald sie in S3 sind. Ich möchte Sie auf unsere neueste Version von SDK 2.4.2 verweisen, die einige neue aktualisierte Funktion hat. Bitte versuchen Sie das Transfer-Dienstprogramm mit der neueren Version des SDK zu konfigurieren.