2014-09-04 11 views
5

Ich benutze LibGDX. Wenn meine App gestartet wird, wird ein Bildschirm erstellt. Wenn der Bildschirm geladen ist, wird eine statische Funktion Module.createStyles() aufgerufen.NullPointerExceptions nur auf einigen Samsung Galaxy-Geräten?

Diese Funktion erstellt eine Reihe von Stilen, die im gesamten Rest der Anwendung verwendet werden (integrierte LibGDX-Stile wie WindowStyle, LabelStyle, TextButtonStyle - alle Arten von Dingen, die zum Erstellen der Benutzeroberflächenobjekte verwendet werden). Wenn der Bildschirm fertig ist, ruft er Module.disposeStyles() auf.

Wie auch immer, nach meiner Google Analytics Crash-Berichte, erhalte ich zufällig einen Nullpointer wenn sie versuchen, zum Beispiel erstellen, einen Dialog mit 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) 

Es gibt absolut keinen Grund Module.dialogStyle sollte null sein. Die einzige Stelle, an der ich dieses Feld auf Null setze, ist Module.disposeStyles(), und diese Funktion wird nur an einer bestimmten Stelle in der Anwendung aufgerufen (ganz am Ende).

Ich würde annehmen, dass dies ein Fehler in meinem Code war, obwohl 95% der Benutzer es nie erleben. Doch alle 5%, die es erleben scheinen Galaxy Benutzer zu sein und ich bin mir nicht sicher, ob das ein Zufall:

  • Galaxy S4
  • Galaxy S III
  • GALAXY Tab 3 lite

Wer hat irgendwelche Ideen? Haben Galaxy-Geräte keinen eingebauten RAM-Manager? Hätte das etwas damit zu tun?

+2

Wahrscheinlich die Garbage-Collection neu und verbesserte das Beste in der Galaxie zu sein, so dass immer das Gerät mehr RAM als die Konkurrenz hat . Ich hatte Probleme im Allgemeinen (habe keine Galaxie) in Code, der den Kontext in einem globalen Feld speichert. Sobald diese entfernt wurden, verschwanden viele Probleme. Außerdem benutze ich onDispose onDestroy nicht mehr. Ich mache alle Aufräumarbeiten in onStop. – danny117

+0

Ich bin mir nicht sicher, warum Ihr Stil bei Galaxy-Geräten plötzlich auf null gesetzt hat, und es könnte schwierig sein, es herauszufinden, ohne es auf diesen Geräten zu testen. Sie können vor dem Erstellen des Dialogfelds eine Nullprüfung für den Stil hinzufügen und für den Fall eines Nullstils ein Google Analytics-Ereignis mit weiteren hinzugefügten Informationen auslösen. (und den Bildschirm ohne Dialog verlassen ..) Auf diese Weise bemerken zumindest die Benutzer den Fehler nicht wirklich und Sie können ihn weiterhin verfolgen. – donfuxx

Antwort

4

Ich werde das übernehmen:

Module.dialogStyle 

ist ein Verweis auf eine static Eigenschaft auf der Module Klasse.

Sie geraten wahrscheinlich in Nebenwirkungen, wie Android den Lebenszyklus von JVMs verwaltet. Es gibt Szenarien (insbesondere auf größeren Geräten), bei denen eine JVM-Instanz wiederverwendet wird, die Probleme verursachen kann (statische Initialisierer wurden beispielsweise bereits ausgeführt und werden nicht erneut ausgeführt). Alternativ können static Zeiger von einer vorherigen Ausführung Ihrer Anwendung in die nächste führen und möglicherweise einen ungültigen oder falschen Status aufweisen. Es hängt von den Einzelheiten ab, wie Ihre App organisiert ist.

Wenn Sie mehr Code einschließen, der zeigt, wie und wann Sie die statischen Felder initialisieren, können wir es wahrscheinlich herausfinden.

Weitere Einzelheiten zu den verschiedenen Lebenszyklen und wie sie lokal zu reproduzieren, sehen: http://bitiotic.com/blog/2013/05/23/libgdx-and-android-application-lifecycle/

+0

Ja, du hast recht, dass es eine statische Eigenschaft ist. Interessant, aber ich wusste nicht, dass nur Teile Ihrer App im Speicher kompromittiert werden können, ich dachte, es wäre alles oder nichts. Ich denke, ich kann diese statischen Member überprüfen, wenn 'onResume()' aufgerufen wird, und verifizieren, dass sie noch existieren. – FTLRalph

Verwandte Themen