定位平台版本 7
在许多设备上偶尔但经常发生。
它可能在 2.1 中更频繁地发生
错误由分析报告,但随后的版本已将其缩小到一个特定问题。
我正在使用与此处找到的代码非常相似的代码创建对话框。
嗨,我有一个奇怪但非常严重的问题。在我的应用程序(游戏)中,我正在创建自定义对话框来通知用户各种事件。我正在使用 showDialog(int) 来执行此操作,而不是在版本 8 中添加了 showDialog(int,Bundle)。这些对话框引用在活动中创建的对象以显示数据。调用 onCreateDialog 后,对象现在为 null,从而导致设备强制关闭。我的假设是触发一个对话框有点像触发一个活动,如果 android 需要内存,它会从调用活动中清理内存。
更多信息:
1:我的代码没有将对象设置为空,因为 A:它被到处引用,并且在创建对话框之前有几次机会抛出空指针。我还在调用 showDialog() 之前立即报告了该值。B:永远不会设置为空,除非它没有默认值。C:尝试在异常期间报告其他不为空的变量的值表明它们也为空。例如:引用一个对 createDialog 无用的从不为 null 的字符串表明它也为 null。然而,它也没有默认值。默认值对我没有帮助,因为那时对话框是不正确的。
2:该应用程序使用了大量内存,但我应该在一个舒适的范围内。
3:游戏中的某些对话更容易出现问题,但它发生在除主要“最重”的活动之外的其他活动中,尽管很少见。
代码看起来大致是这样的,不过我是在解释流程,实际的活动大约是一千行:
Class DataStructure {
String ID;
String Description;
String name;
boolean hasSpace;
//initialize based on XML
}
Class Main extends Activity etc etc{<br>
DataStructure selectedData;
onClick{
if(gameState == 1){
selectedData = constructSelectedData();
if(selectedData == null){
//report error. Never happens.
}
}else if (gameState == 2){
if(selectedData == null){
//report error, never happens.
}
showDialog(5);
}
onCreateDialog(int dialogDesired){
if(dialogDesired == 5){
if(selectedDialog.hasSpace){//NULL POINTER HERE REGARDLESS OF VARIABLES REFERENCED.
//set up dialog using typical builder model
}
}
}
编辑:堆栈跟踪
引起:在 com.company.game.activity.GameMainMenuActivity.onCreateDialog(GameMainMenuActivity.java:1521) 在 android.app.Activity.onCreateDialog(Activity.java:2472) 在 android.app.Activity.createDialog 的 java.lang.NullPointerException (Activity.java:881) 在 android.app.Activity.restoreManagedDialogs(Activity.java:870) 在 android.app.Activity.performRestoreInstanceState(Activity.java:816) 在 android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java: 1096) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2715)
关于堆栈跟踪的一些注释:它似乎正在恢复活动,这很奇怪,因为它没有去任何地方。当对话框存在或创建时,我可以将主页按钮退出活动。事实上,作为 GameMainMenuActivity 的一部分,游戏会在恢复时重置。该错误也很常见,因此极不可能是用户在某个特定位置从游戏中退出的情况。我每天收到几十个这样的报告。