android Nullpointerexception,意图data = null

时间:2013-05-04 06:46:50

标签: android android-intent android-activity

我正在创建一个应用程序,其中包含3个活动,例如A,B和C.活动A是主要活动,在应用程序打开时启动。

使用startActivityForResult(intent,1)将活动A称为活动B. 活动B返回一个成功捕获的结果,在活动A的onActivityResult中,我使用startActivityForResult启动活动C(intent2,2);

这是我的活动A的onActivityResult

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    Log.d("MAIN","Inside on activity result requestCode is : " + requestCode);
    if(requestCode == 1){
        if(resultCode == RESULT_OK){
            Log.d("MAINACT", "Inside RESULT CODE OK");
            if(data.getStringExtra("puzzleID")!=null){
                Log.d("MAINACT", "Inside puzzle has been selected");
                String puzzleIdResult = data.getStringExtra("puzzleID");
                Intent puzzleIntent = new Intent(MainActivity.this, TrialActivity.class);
                puzzleIntent.putExtra("puzzleID", puzzleIdResult);
                startActivityForResult(puzzleIntent, 2);
            }
         }
    }else if(requestCode == 2){
         Log.d("MAINACT", "Inside request code is 2 result code is : " + resultCode);
         if(resultCode == 0){
             if(data!=null){
             Log.d("MAINACT", "Inside STATUS NOT NULL");
             String puzzleStatus = data.getStringExtra("status");
             Log.d("MAINACT", "Puzzle status retrieved is : " + puzzleStatus);
             if(puzzleStatus.equals("pause")){
                 Log.d("MAINACT", "Inside puzzle status is paused");
             }
    }else{
          Log.d("MAINACT", "Data is null!!");
    }
}

这是来自Activity C的返回结果Intent

@Override
protected void onPause() {
    super.onPause();
    Log.d(TRIALTAG, "On Pause CALLED");
        Log.d(TRIALTAG, "Sending Intent");
        String puzzleID = Integer.toString(puzzle_ID);
    Intent returnPause = new Intent();
    returnPause.putExtra("status", "pause");
    returnPause.putExtra("puzzleid", puzzleID);
    if(getParent() == null){
        setResult(Activity.RESULT_OK, returnPause);
    }else{
        getParent().setResult(Activity.RESULT_OK, returnPause);
    }
    finish();
 }

从活动C返回时,我得到一个nullpointerexception和语句。

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=0, data=null} to activity 
{com.mypackagename.sudoku/com.mypackagename.sudoku.MainActivity}: java.lang.NullPointerException

我输入数据!= null稍后检查以防止崩溃。我得到数据是空的!!现在每次我在Activity C中暂停。我在阅读了SO上的其他解决方案后尝试了getParent方法,但这没有帮助。为什么我的数据在活动B中设置但在活动C中没有设置?这是我的第一个完整的应用程序,所以请原谅任何无知。

2 个答案:

答案 0 :(得分:0)

@Override
protected void onDestroy() {
    Log.d(TRIALTAG, "On Pause CALLED");
    Log.d(TRIALTAG, "Sending Intent");
    String puzzleID = Integer.toString(puzzle_ID);
    Intent returnPause = new Intent();
    returnPause.putExtra("status", "pause");
    returnPause.putExtra("puzzleid", puzzleID);
    if (getParent() == null) {
        setResult(Activity.RESULT_OK, returnPause);
    } else {
        getParent().setResult(Activity.RESULT_OK, returnPause);
    }
    super.onDestoy();
}

尝试使用此功能。我使用onDestroy代替onPause并删除了完成。并在最后调用了supoer.onDestroy。

答案 1 :(得分:0)

似乎没有调用setResult()方法,因为根据异常设置的结果代码是0(RESULT_CANCELED)而不是-1(RESULT_OK)

你确定你的活动C没有在Integer.toString(puzzle_ID)崩溃吗?

调试Activity C的onPause()方法将帮助您解决崩溃问题。

P.S:这就是为什么你应该避免使用魔法数字,如if(resultCode == 0)

P.S:FYI,RESULT_CANCELED(0):如果子活动因任何原因(例如崩溃)失败,则父活动将收到代码为RESULT_CANCELED的结果。

更新

在onPause()或onDestroy中设置结果不会起作用。将结果设置为onBackPressed()或onFinish()

请参阅此result not set in onPause() using setResult() when pressing the Back button