Aws sdk的转移性

时间:2016-05-15 07:18:42

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

我在将文件上传到亚马逊s3时遇到问题。要跟踪上传文件状态,我除了transferUtility之外还使用TransferListener。确切的问题是onProgressChanged方法有时候根本没有被调用。有时它工作正常。我发现当我尝试上传较大的文件时,问题就出现了。所以这就是我的尝试方式。

代码:

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

    }

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

    }
}
  

如何解决这个问题?

     

避免此类问题的最佳做法是什么?

更新:

这里84是我的文件ID。 0是transferrred的字节数。我在onProgressChanged方法

中将其打印到logcat中
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

2 个答案:

答案 0 :(得分:1)

不确定您使用的是哪个版本。版本2.2.15中存在一个已知错误,其中未正确报告套接字超时。请升级到v2.2.16。如有其他问题,请在http://localhost处打开一个问题。

答案 1 :(得分:0)

截至目前,我们没有使用AWS SDK进行大型文件上传的恢复功能,但是,您可以尝试将大型文件分割为多个较小尺寸的部件并逐个上传并重新组装它们一旦他们在S3。说到这里,我想指出我们的 最新版本的SDK 2.4.2 ,它有一些新的更新功能。请尝试使用较新版本的SDK配置Transfer Utility