java – 仅在某些三星Galaxy设备上使用NullPointerExceptions?

我正在使用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/

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...