Android 安卓亚马逊S3上传崩溃

Android 安卓亚马逊S3上传崩溃,android,amazon-web-services,amazon-s3,Android,Amazon Web Services,Amazon S3,我正在试图找出在Amazon S3 bucket上上传时导致此崩溃的原因 日志为: Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.amazonaws.mobileconnectors.s3.transferutility.TransferService$NetworkInfoReceiver.isNetworkConnected()' on a null

我正在试图找出在Amazon S3 bucket上上传时导致此崩溃的原因

日志为:

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.amazonaws.mobileconnectors.s3.transferutility.TransferService$NetworkInfoReceiver.isNetworkConnected()' on a null object reference
   at com.amazonaws.mobileconnectors.s3.transferutility.TransferService.execCommand(TransferService.java:287)
   at com.amazonaws.mobileconnectors.s3.transferutility.TransferService$UpdateHandler.handleMessage(TransferService.java:224)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:145)
   at android.os.HandlerThread.run(HandlerThread.java:61)
我的代码有问题吗

public AmazonTransferUtility uploadFileToAmazonS3(String data, Date date){

    generateTextFileFromString(data, date);

    File jsonFile = new File(getDataPath(), textName);

    TransferObserver observer = transferUtility.upload(
            textBucketName,
            mUUID + File.separator + date.getTime() + textName ,
            jsonFile
    );
    mListener.onAsyncStart();

    observer.setTransferListener(new TransferListener() {
        @Override
        public void onStateChanged(int id, TransferState state) {
            try {
                if (state.toString().equals("COMPLETED")) {
                    deleteFile(textName);
                    if (mListener != null) {
                        JSONObject result = new JSONObject();
                        result.put("result", state.toString());
                        mListener.onAsyncSuccess(result);
                    }
                }
                else if (state.toString().equals("FAILED") ||
                        state.toString().equals("UNKNOWN")
                        ){
                    mListener.onAsyncFail(id, state.toString());
                }
                else{
                    Log.i(TAG, "S3 TransferState :" + state.toString());
                }
            }catch (JSONException e){
                 Log.e(TAG, e.getLocalizedMessage());
            }
        }

        @Override
        public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {
            if (bytesCurrent == bytesTotal){
                Log.i(TAG, "Completed");
            }
            else{
               Log.i(TAG, "Current bytes: " + bytesCurrent + " Of bytesTotal : " + bytesTotal);
            }
        }

        @Override
        public void onError(int id, Exception ex) {
            mListener.onAsyncFail(id,ex.getMessage());
        }
    });
    return this;
}
如果有的话,我怎样才能抓住这个错误,使我的应用程序停止崩溃,只是取消我的上传任务

顺便说一句


该崩溃是间歇性的,同步成功率为1/5这似乎不是您正在做的事情,而是在AWS SDK代码中。这意味着NPE是一个脆弱的网络。(和)并且在SDK(v2.2.13)中回滚一个版本可能会有帮助

那也是


我建议按照那些票(请不要
+1
)。有理由预计他们会在一周内修复它。

这里有一个解决方法,在修复错误之前,只需在应用程序的
onCreate
中启动它,或者在任何上传活动开始之前启动:

/**
 * work around for a bug:
 * http://stackoverflow.com/questions/36587511/android-amazon-s3-uploading-crash
 */
public static void startupTranferServiceEarlyToAvoidBugs(Context context) {
    final TransferUtility tu = new TransferUtility(
            new AmazonS3Client((AWSCredentials)null),
            context);
    tu.cancel(Integer.MAX_VALUE - 1);
}

基本上,这是告诉
TransferService
启动并初始化它的成员变量,这样它就不会在准备好之前进入试图服务命令的状态。

“崩溃是间歇性的,成功同步的比率是五分之一”意味着它有时会工作?@LazarK是的,在5次尝试中,它只会崩溃一次。您使用的AWS SDK版本是什么?编译'com.amazonaws:AWS android SDK核心:2.+'compile'com.amazonaws:AWS android SDK cognito:2.+'compile'com.amazonaws:AWS android SDK ddb:2.+'您正在使用的版本,只是范围。不过,我猜测2.2.14(head)就是基于这个。我很遗憾地告诉大家,将版本设置为2.2.13并不能解决问题。