2014-09-04 1 views
5

Я использую LibGDX. Когда мое приложение запускается, оно создает экран. Когда экран загружен, он вызывает статическую функцию Module.createStyles().NullPointerExceptions только на некоторых устройствах Samsung Galaxy?

Эта функция создает кучу стилей, которые будут использоваться во всей остальной части приложения (встроенные стили LibGDX, такие как WindowStyle, LabelStyle, TextButtonStyle - все типы объектов, используемых для создания объектов пользовательского интерфейса).

Когда экран сделан, он вызывает Module.disposeStyles().

Во всяком случае, по моим отчеты о сбоях Google Analytics, я случайно получить NullPointerException при попытке, например, создать диалог с Module.dialogStyle:

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%, которые испытывают это, кажется, пользователи Galaxy, и я не уверен, что это совпадение:

  • Galaxy S4
  • Galaxy S III
  • GALAXY Tab 3 облегченный

У кого-нибудь есть идеи? У устройств Galaxy нет встроенного диспетчера RAM? Будет ли это иметь какое-то отношение к этому?

+2

Возможно сбор мусора новый и улучшенный, чтобы быть лучшим в Галактике, так что устройство всегда имеет больше оперативной памяти, чем у конкурентов , У меня были проблемы вообще (не имеют галактики) в коде, который сохраняет контекст в глобальном поле. Как только они были удалены, многие проблемы исчезли. Также я не использую onDispose onDestroy больше, я все очищаю в onStop. – danny117

+0

Не знаете, почему ваш стиль внезапно указал на нуль с устройствами Galaxy, и это может быть трудно понять, не тестируя его на этих устройствах. Вы можете добавить нулевую проверку стиля перед созданием диалогового окна, а для случая пустого стиля - событие Google Analytics с добавленной дополнительной информацией. (и выйти из экрана без диалога ..) Таким образом, по крайней мере, пользователи не замечают ошибку, и вы все равно можете ее отслеживать. – donfuxx

ответ

4

Я буду считать, что:

Module.dialogStyle 

является ссылкой на static собственности на Module класса.

Возможно, вы столкнулись с побочными эффектами того, как Android управляет жизненным циклом JVM. Существуют сценарии (особенно на более крупных устройствах), где экземпляр JVM будет повторно использоваться, что может вызвать проблемы (например, статические инициализаторы уже выполнялись, и они не будут повторно запускаться). Альтернативно, указатели static могут жить от предыдущего запуска вашего приложения в следующем и могут иметь недопустимое или неправильное состояние в них. Это зависит от того, как организовано ваше приложение.

Если вы указали больше кода, который показывает, как и когда вы инициализируете статические поля, мы можем, вероятно, выяснить это.

Для получения более подробной информации о различных жизненных циклов и как воспроизвести их на месте, см: http://bitiotic.com/blog/2013/05/23/libgdx-and-android-application-lifecycle/

+0

Да, вы правы, что это статическое свойство. Интересно, однако, я не знал, что только части вашего приложения могут быть скомпрометированы в памяти, я думал, что это все или ничего. Я думаю, что я могу уйти с проверкой этих статических членов, когда вызывается 'onResume()' и проверяет, что они все еще существуют. – FTLRalph