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)
正如我所说,我自己从来没有能够重现这个问题,并且根据我所看到的从意图返回数据的其他示例,代码看起来是正确的。如果需要更多信息,请给我留言。堆栈跟踪与代码不一致。您的代码正在调用
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分钟后返回),但我看不出在您的特定情况下这会导致问题。