仅在某些Samsung Galaxy设备上出现NullPointerExceptions?
我正在使用LibGDX。当我的应用程序启动时,它会创建一个屏幕。当屏幕被加载时,它调用一个静态函数Module.createStyles()
。仅在某些Samsung Galaxy设备上出现NullPointerExceptions?
该函数创建了一系列将在整个应用程序中使用的样式(内置LibGDX样式,如WindowStyle,LabelStyle,TextButtonStyle - 用于创建用户界面对象的所有类型的东西)。
当屏幕完成时,它调用Module.disposeStyles()
。
总之,根据我的谷歌分析崩溃报告,我随意尝试,例如,创建一个对话框,Module.dialogStyle时得到NullPointerException异常:
ExitDialog exitDialog = new ExitDialog("Are you sure?", Module.dialogStyle);
Thread: GLThread 2089, Exception: java.lang.IllegalArgumentException: style cannot be null.
at package.Window.setStyle(Window.java:181)
at package.Window.<init>(Window.java:63)
at package.Dialog.<init>(Dialog.java:65)
at package.ExitDialog$1.<init>(ExitDialog.java:38)
绝对没有理由Module.dialogStyle应该为空。我唯一将这个字段置为空的地方是Module.disposeStyles()
,这个函数只在应用程序的一个特定位置(在最后)被调用。
我认为这是我的代码中的一个错误,尽管有95%的用户从未体验过它。然而,那些经历都在5%似乎是银河的用户,我不知道这是一个巧合:
- 银河S4
- 的Galaxy S III
- Galaxy Tab的3精简版
任何人有任何想法?不要Galaxy设备有内置的RAM管理器?这与这有什么关系?
我要去假设:
Module.dialogStyle
是对Module
类static
属性的引用。
您可能会遇到Android管理JVM生命周期的副作用。有些场景(尤其是在较大的设备上)会导致JVM实例重用,从而导致问题(例如,静态初始化器已经运行,并且不会重新运行)。或者,static
指针可能会从先前的应用程序运行到下一个应用程序,并且可能在其中存在无效或不正确的状态。这取决于您的应用程序的组织方式。
如果您包含更多显示如何以及何时初始化静态字段的代码,我们可以将其计算出来。
有关不同的生命周期,以及如何重现他们在当地的详细信息,请参阅: http://bitiotic.com/blog/2013/05/23/libgdx-and-android-application-lifecycle/
是的,你说的是一个静态属性。有趣的是,我不知道只有部分应用程序可以在内存中受到损害,我认为这是一切或没有。当我调用'onResume()'并验证它们仍然存在时,我想我可以逃避检查这些静态成员。 – FTLRalph 2014-09-05 11:36:45
大概垃圾收集是新的和改进是银河系中最让设备始终比竞争对手更多的RAM 。一般来说,我有问题(没有银河系),它将代码保存在全局域中。一旦这些被删除,许多问题就消失了。此外,我不再使用onDispose onDestroy,我在onStop中进行所有清理。 – danny117 2014-09-04 21:50:01
不知道为什么你的风格突然用Galaxy设备指向null,如果不在这些设备上测试它,可能很难弄清楚。您可以在创建对话框之前为样式添加空检查,对于空样式的情况,添加更多信息时触发Google Analytics事件。 (并且没有对话框退出屏幕..)这样至少用户没有真正注意到这个错误,你仍然可以继续跟踪它。 – donfuxx 2014-09-04 22:28:21