我正在使用LibGDX.当我的应用程序启动时,它会创建一个屏幕.加载Screen时,它会调用静态函数Module.createStyles().
这个函数创建了一系列样式,这些样式将在整个应用程序的其余部分使用(内置的LibGDX样式,如WindowStyle,LabelStyle,TextButtonStyle – 用于创建用户界面对象的所有类型的东西).
屏幕完成后,它会调用Module.disposeStyles().
无论如何,根据我的Google Analytics崩溃报告,我在尝试使用Module.dialogStyle创建一个Dialog时会随机获取NullPointerException:
ExitDialog exitDialog = new ExitDialog(“你确定吗?”,Module.dialogStyle);
Thread: GLThread 2089,Exception: java.lang.IllegalArgumentException: style cannot be null.
at package.Window.setStyle(Window.java:181)
at package.Window.
Module.dialogStyle绝对没有理由应该为null.我将此字段置空的唯一位置是在Module.disposeStyles()中,此函数仅在应用程序的一个特定位置(最后)调用.
我认为这是我的代码中的一个错误,尽管95%的用户从未体验过它.但是,所有5%的用户体验它似乎都是Galaxy用户,我不确定这是不是巧合:
> Galaxy S4
> Galaxy S III
> GALAXY Tab 3 lite
有人有主意吗? Galaxy设备没有内置的RAM管理器吗?这会与此有关吗?
Module.dialogStyle
是对Module类的静态属性的引用.
您可能正在遇到Android管理JVM生命周期的副作用.有些场景(特别是在更大的设备上)会重新使用可能导致问题的JVM实例(例如,静态初始化器已经运行,并且不会重新运行).或者,静态指针可能从您之前的应用程序运行到下一个,并且可能在其中具有无效或不正确的状态.这取决于您的应用程序的组织方式.
有关不同生命周期以及如何在本地重现它们的更多详细信息,请参阅:
http://bitiotic.com/blog/2013/05/23/libgdx-and-android-application-lifecycle/