2016-04-13 27 views
2

Amazon S3バケットにアップロードする際に、このクラッシュの原因を突き止めようとしています。Android Amazon S3クラッシュをアップロードする

ログは次のとおりです。

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

そして、私のアプリがクラッシュ停止し、ちょうど私のアップロードタスクをキャンセルするように、私はこのエラーをキャッチすることができますどのようにこれまでであれば。

BTW。クラッシュは断続的で、比率はこれはそれがAWS SDKのコードの中ですが、あなたがやっている何かであるようには見えない5成功した同期のうち1

+0

「クラッシュは断続的で、比率は5分のうち1分の成功した同期」は、いつか動作することを意味しますか? –

+0

@LazarKはい5回の試行のうち1回だけクラッシュします。 – Janwel

+0

どのバージョンのAWS SDKを使用していますか? – tedder42

答えて

4

されていることを

。そのNPEの意味は薄れたネットワークです。 It's been reported to Amazon on github(およびconfirmed in another ticket)、SDK(v2.2.13)mayヘルプの1つのバージョンをロールバックして表示されます。

これもmakes sense given the changes made in 2.2.14, which are related to S3 transfer and the networkです。

私はそれらのチケットに従うことをお勧めします(+1)。彼らが1週間以内にそれを修正すると期待することは合理的です。ここで

+1

2.2.13にバージョンを設定しても問題は解決しないことを知らせてしまいました。 – Lisandro

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を伝えています準備が整う前にコマンドを処理しようとする条件に入力しないように、メンバー変数です。

関連する問題