2016-07-13 4 views
0

したがって、基本的に私はアプリケーションに:ボタンを押してギャラリーを開き、ユーザーが画像を1つ選択した後、変数にuriを保存します。これはすべて必要なことですが、startActivityForResult()をコールした後、後続のコードがまだバックグラウンドで実行されていて、必要な変数がインテントから取得されていないため、NullPointerExceptionエラーが発生します。startActivityForResult()を呼び出した後のコードはまだ実行されています

public class MainActivity extends AppCompatActivity { 

    final static int PICK_IMAGE_REQUEST = 1; 

    private String imageUriStr; 

    SharedPreferences prefs; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     prefs = this.getSharedPreferences("MyPreferences",MODE_PRIVATE); 

     ImageView addImgButton = (ImageView) findViewById(R.id.add_img_button); 

     addImgButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Intent intent = new Intent(); 
       intent.setType("image/*"); 
       intent.setAction(Intent.ACTION_GET_CONTENT); 
       startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST); 

       if (prefs.contains(imageUriStr)) { 
        imageUriStr = prefs.getString("imageUriStr", ""); //Get the data from prefs 
       } 

       Log.d("Value",imageUriStr); //verify if it is correct 

       prefs.edit().clear(); 
      } 
     }); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) { 

      imageUriStr = data.getData().toString(); //convert to string to use it with SharedPreferences 

      prefs.edit().putString("imageUriStr",imageUriStr).apply(); 

     } 

    } 
} 

一つの解決策は、onActivityresult内のすべてを行うことであろうが、私もそのURIに基づいて画像をトリミングし、後でユーザーに別の意図をしたいが、私はonActivityresult内部の意思があまりにも乱雑になると思うかでありますそれは容認できますか?私は何かが足りないと思う。この

E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example.android.prototypeapp, PID: 17826 
java.lang.NullPointerException: println needs a message 
    at android.util.Log.println_native(Native Method) 
    at android.util.Log.d(Log.java:154) 
    at com.example.android.prototypeapp.MainActivity$1$override.onClick(MainActivity.java:41) 
    at com.example.android.prototypeapp.MainActivity$1$override.access$dispatch(MainActivity.java) 
    at com.example.android.prototypeapp.MainActivity$1.onClick(MainActivity.java:0) 
    at android.view.View.performClick(View.java:5264) 
    at android.view.View$PerformClick.run(View.java:21297) 
    at android.os.Handler.handleCallback(Handler.java:743) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:150) 
    at android.app.ActivityThread.main(ActivityThread.java:5546) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684) 
+0

Log.d( "値"、imageUriStr) 'であなたの' imageUriStr'は; '( – SripadRaj

+0

場合(prefs.contains nullでありますimageUriStr))をif(prefs.contains( "imageUriStr"))に変更し、Log.dを内部に追加した場合 – comeback4you

+0

ありがとうございました!だから、これは次のように動作しますか?startActivityForResultを呼び出した後のコードは、バックグラウンドで実行され、返った後、startActivityForResultの後の行からピックアップされますか? –

答えて

0

あなたprivate String imageUriStr;を生成します私のコードで維持

は、あなたがnullポインタ例外を取得しているnullであるnull.Sinceです。空の文字列をprivate String imageUriStr = "";のように割り当てます。

など共有好みで

チェック: if(prefs.contains("imageUriStr"))

0

あなたのコードは、このラインにクラッシュさ:

Log.d("Value",imageUriStr); 

理由:imageUriStr値がnullであり、有効なメッセージを印刷するように要求されログ

ログは次のように使用できます。

Log.d("Value","Image URI Value: "+imageUriStr); 

か、内部のあなたのログを置くことができる場合のブロックのように:

 if (prefs.contains(imageUriStr)) { 
         imageUriStr = prefs.getString("imageUriStr", "");//Get the data from prefs 
      Log.d("Value",imageUriStr); //verify if it is correct 
             } 
関連する問題