【问题标题】:android Nullpointerexception with intent data=null alwaysandroid Nullpointerexception 与 Intent data=null 总是
【发布时间】:2013-05-04 19:03:11
【问题描述】:

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

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

这是我的活动 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 返回时,我得到一个空指针异常和语句。

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

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

【问题讨论】:

  • 请缩进代码
  • 糟糕的阅读你的代码老兄..
  • 抱歉缩进效果不佳..应该让它更清晰..@Shobhit Puri 非常感谢你清理它..下次我会自己做..

标签: android android-intent android-activity


【解决方案1】:

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

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

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

P.S:这就是为什么你应该避免使用像 if(resultCode == 0) 这样的幻数

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

更新

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

看到这个result not set in onPause() using setResult() when pressing the Back button

【讨论】:

  • 我尝试调试 onPause() 并且它为 String puzzleID 和 int 值提供了正确的值,因此它不会在那里崩溃。显然 setResult 不起作用,因为它仍然给出 resultCode = 0。感谢您的回复..我仍然不确定出了什么问题..
  • 在 onPause() 或 onDestroy 中设置结果不起作用。在 onBackPressed() 或 onFinish() stackoverflow.com/questions/10023969/… 中设置结果
  • 非常感谢您为我指明了正确的方向,这就像一个魅力。现在想通了。我如何选择这个位作为答案,或者如果你可以编辑你之前的回复,我会接受这个作为答案。
【解决方案2】:
@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。

【讨论】:

  • 不会 onDestroy 破坏我的活动吗?我只想暂停它,并在用户单击 Activity A 中的继续按钮时恢复 Activity。在 onDestroy 之后我还能这样做吗?
  • onactivityresult 将在您调用的活动完成时被调用。要在两个正在运行的活动之间进行通信,您需要其他进程而不是这个
  • 好的我明白你在说什么,但我需要在暂停时从视图中删除活动 C,并显示活动 A 直到用户选择继续。 finish() 让我这样做,但我猜这不是最好的方法。感谢您的回复,让我稍微了解一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 2014-03-06
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多