Android onActivityResult意向参数周期性地为null

Android onActivityResult意向参数周期性地为null,android,Android,我有一个“保存的游戏选择器”活动,供用户打开保存的游戏。我启动“结果”活动,并将代表已保存游戏的字符串返回给父活动 我一直在使用的代码并不比这更复杂: if(savedGameId != null) { Intent result = new Intent(); result.putExtra("saved_game_key", savedGameId); setResult(Activity.RESULT_OK, result); finish(); } 在

我有一个“保存的游戏选择器”活动,供用户打开保存的游戏。我启动“结果”活动,并将代表已保存游戏的字符串返回给父活动

我一直在使用的代码并不比这更复杂:

if(savedGameId != null) {
    Intent result = new Intent();
    result.putExtra("saved_game_key", savedGameId); 
    setResult(Activity.RESULT_OK, result);
    finish();
}
在onActivityResult中:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(requestCode) {
    case SAVED_GAME_ACTIVITY:
        if(resultCode == Activity.RESULT_OK) {
            if(data.hasExtra("saved_game_key") {
                String savedGameId = data.getExtra("saved_game_key");
                ...
            } else {
                // couldn't load game
            }
        }
        break;
    }
}
这在我所有的测试设备和模拟器上100%的时间都是有效的。但是,我会定期为
data.hasExtra(“saved\u game\u key”)
调用获取NPE的崩溃报告

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.content.Intent.hasExtra(java.lang.String)' on a null object reference
    at com.xxxx.yyyy.MainActivity.onActivityResult(MainActivity.java)
    at android.app.Activity.dispatchActivityResult(Activity.java:6508)
    ...
到目前为止,我已收到此报告的android版本和设备:

  • 安卓6.0-MI最大值(氢)
  • 安卓6.0-联想K5笔记本(A7020a48)
  • 安卓6.0-MotoG(4)(雅典娜)
  • Android 5.1-Galaxy Note 10.1(lt033g)
  • Android 4.0.3-4.0.4-Xperia tipo dual(ST21a2)
我无法亲自复制这个问题。我将尝试获得上述设备之一,看看是否可以获得更多信息

同时,我搜索了google/stackoverflow,没有发现任何类似于这种情况的东西

我的问题

在某些情况下,是否有一些我忽略的边缘情况会导致返回的数据意图为空


正如我所说,我自己从来没有能够重现这个问题,并且根据我所看到的从意图返回数据的其他示例,代码看起来是正确的。如果需要更多信息,请给我留言。

堆栈跟踪与代码不一致。您的代码正在调用
getExtra()
;堆栈跟踪正在抱怨
hasExtra()
。假设您总是向
setResult()
提供一个非
null
Intent
,并且您只在
RESULT\u OK
分支中查找额外的内容,那么您就可以了。确保保存的游戏选择器活动只有一个
setResult()
调用,并且没有可能意外调用
setResult(activity.RESULT\u OK)
的代码路径,没有
意图
@commonware我的代码正在调用
数据。hasExtra()
在调用
data.getExtra()
之前的条件中。该死,我今天读代码有困难。。。我道歉。不过,我的其余评论仍然有效:请尝试确认没有发送
RESULT\u OK
但不包含
意图的场景。默认的“结果”是
result\u cancelled
,因此保存的游戏选择器活动的任何其他退出路径(例如,用户按下后退键)都不会导致
result\u OK
@commonware这很好。:-)是的,这段代码真的和我在这里展示的一样简单。事实上,我自己从来没能重现这个错误。尽管如此,我的开发人员控制台中有11个错误报告显示了此崩溃。我希望有一些边缘案件,我只是不知道。我现在不知道从哪里开始。如何修复正确的代码?:-)如果这是一次千载难逢的崩溃(即少数设备,甚至它们只在极少数情况下才会出现),您可能会满足于检查
null
并执行“哎呀,出了问题,请重试”UI。除此之外,根据您从崩溃报告中得到的信息,查看是否有迹象表明您的流程确实是新的。边缘案例的一个常见来源是您的进程在后台终止(例如,用户进入已保存的游戏选择器,按HOME键,20分钟后返回),但我看不出这会在您的特定情况下导致问题。堆栈跟踪与代码不符。您的代码正在调用
getExtra()
;堆栈跟踪正在抱怨
hasExtra()
。假设您总是向
setResult()
提供一个非
null
Intent
,并且您只在
RESULT\u OK
分支中查找额外的内容,那么您就可以了。确保保存的游戏选择器活动只有一个
setResult()
调用,并且没有可能意外调用
setResult(activity.RESULT\u OK)
的代码路径,没有
意图
@commonware我的代码正在调用
数据。hasExtra()
在调用
data.getExtra()
之前的条件中。该死,我今天读代码有困难。。。我道歉。不过,我的其余评论仍然有效:请尝试确认没有发送
RESULT\u OK
但不包含
意图的场景。默认的“结果”是
result\u cancelled
,因此保存的游戏选择器活动的任何其他退出路径(例如,用户按下后退键)都不会导致
result\u OK
@commonware这很好。:-)是的,这段代码真的和我在这里展示的一样简单。事实上,我自己从来没能重现这个错误。尽管如此,我的开发人员控制台中有11个错误报告显示了此崩溃。我希望有一些边缘案件,我只是不知道。我现在不知道从哪里开始。如何修复正确的代码?:-)如果这是一次千载难逢的崩溃(即少数设备,甚至它们只在极少数情况下才会出现),您可能会满足于检查
null
并执行“哎呀,出了问题,请重试”UI。除此之外,根据您从崩溃报告中得到的信息,查看是否有迹象表明您的流程确实是新的。边缘案例的一个常见来源是您的进程在后台被终止(例如,用户进入已保存的游戏选择器,按HOME键,20分钟后返回),但我看不出在您的特定情况下这会导致问题。