Speicher Problem(?) führt zu Crash

X

xazen

Ambitioniertes Mitglied
0
Hallo Leute,

Bei meiner App wird in einer Activity (im Menü), einige Variablen definiert. In einer anderen Activity läuft ein Spiel ab. Wenn man im Spiel ist und und über der Taste Home die App in den Hintergrund setzt, wird nach einiger Zeit ältere Daten vom Speicher genommen. Anscheinend werden auch einige Variablen, die im Menü definiert werden vom Speicher genommen, wenn dieser zu voll wird.
Wenn man die App vom Hintergrund wieder aufruft, stürtzt die App ab, weil einige Variablen fehlen. Die App stürzt nicht ab, wenn man es sofort oder nach einigen wenigen Minuten wieder vom Hintergrund aufruft, sondern erst nach einiger Zeit. Bei einen Handy von einen Kumpel würde es nach etwa 15 Minuten abstürzen. Er hat viele Widgets und Hintergrund-Apps die automatisch Informationen anfordern. Daher denke ich, dass es ein Speicher Problem ist.

Liegt das Problem ganz woanders? Wie kann ich es am besten testen und debuggen?
 
Logcat wäre ein Anfang...
 
In der eigentlichen Activity, wo das Spiel abläuft, kommt es zu einen NullPointerException.

Die Stelle, wo es abstürtzt ist ein if-Satz
Code:
if(ActivityOne.TEST){
//tu was
}

Kurz davor wird eine Klasse, die von Application erbt, aufgerufen. Darin befinden sich aber nur Codeschnipsel für OpenFeint. Die Activity, wo die Variablen initialisiert werden, wird nicht aufgerufen.
 
ActivityOne ist wohl die erste Activity? Und TEST ist vom Typ Boolean?
Warum übergibst du diese variable nicht einfach im Intent? Oder speicherst sie in einer SharedPrefs? Scheinbar musst du sie ja auch zum Starten des Spiels haben. Oder du definierst ActivityOne als Launcher, dann wird bei einem Neustart diese aufgerufen.
 
Genau.

Ich habe einige final Variblen, die ich dazu benutze, verschiedene Versionen der App auszuspielen. Sollten solche Variablen allgemein in der Launcher gespeichert werden ? Es gibt noch weitere Variablen, die in einer anderen Klasse gespeichert sind. Diese speichern die Spieleinstellungen. Also müsste ich alle Variablen an einer anderen Stelle initialisieren ?

Wie würde ich dann die alten Werte beibehalten?
 
Sind die Variablen Konstanten? Also sowas:
final int TEST = 1;

Wenn ja, dann solltest du sie static final machen:
static final int TEST = 1;
 
Die sind final static.
 
Dann kann es keine NullPointerException an der Stelle geben :D
 
Aus dem Grunde vermute ich ja dass es vom Speicher genommen wurde. Wenn man die App schnell wieder aufgenommen wird, dann funktioniert es einwandfrei. Es stürtzt wirklich nur dann ab, wenn man eine längere Zeit wartet. Ich würde mich wundern, wenn Android OS es wirklich vom Speicher nehmen würde, aber mir fällt keine andere Erklärung dafür ein. Ich versuche nochmal das Problem darzustellen:

OpenFeintApp extends Application:
Wird auch bei Wiederaufnahme vorher gestartet
MenuActivity extends Activity:
mehrere final static Variablen
weitere Variablen, um Einstellungen zu speichern
wird vor Wiederaufnahme nicht aufgerufen - wenn man die App neu startet muss man natürlich am Menü vorbei um ins Spiel zu kommen.
Game extends Activity:
Stürtzt nicht ab bei schneller Wiederaufnahme der App (bei meinen neuen Samsung Galaxy S2 ohne automatische Aktualisierungen stürtzt es nie ab - jedenfalls noch nicht vorgekommen)
Stürtzt ab, wenn man längere Zeit wartet (beim Samsung Galaxy S, worauf viele Sachen automatisch abgerufen werden)

Und Log gibt einen NullPointerException bei so einer Zeile:
if (MenuActivity.FINAL_STATIC_VARIABLE)
doSomething();
 
Also entweder es ist ein richtig übler Bug im Classloader der VM, die Variable ist nicht final static und direkt initialisiert oder es ist die falsche Zeile.
 
Ich habe auch gedacht dass es evtl die falsche Zeile sein könnte. Aber wenn es nicht die Zeile ist, dann wäre es noch verwirrender. Es könnte vllt auch die nächste sein. Da die final static Variable aber auf false gesetzt ist, kann das unmöglich sein.

Hast du eine Idee wie ich es testen kann, ob es wirklich daran liegt?

Also gehst du davon aus, dass nicht die Variable fehlt sondern die Klasse ?
 
Nein, ich gehe davon aus, dass du auf eine Variable zugreifst die null ist.
Folgendes kann nicht sein:

final static Object KONSTANTE = new Object();
Das kann nie null sein!

MeineKlasse.KONSTANTE
Kann nie null sein!

Wenn deine Konstante so ähnlich wie oben deklariert ist, dann kann die if Bedingung niemals eine NPE auslösen. Eine NPE kriegst du nur bei sowas:

Object obj = null;
...
obj.equals(otherObj);

Du kriegst NUR eine NPE wenn vor dem Punkt eine Objektreferenz steht die null ist.


Testen ist doch eigentlich ganz einfach: Häng dein Handy per USB an, starte deine App im Debugmodus. Dann schieße sie ab (Taskkiller) und starte sie neu. Wenn du jetzt den Breakpoint richtig hast kannst du Schritt für Schritt nachvollziehen was schiefgeht.
 
Leider ist es eine gepublishte Version.

Laut SVN ist stürtzt es wirklich bei einer if-Abfrage ab.

Ich habe die Variable wie das obige Beispiel deklariert:

final static boolean CONSTANT = false;

Und ich kann es wie gesagt mit meinen Handy nicht reproduzieren. Ich werde mir dann wohl das Handy ne Weile ausleihen müssen, bei dem der Fehler passiert.

Aber auf jedenfall erst mal danke für die Hilfe.
 
Weißt du nicht mehr welche Revision du veröffentlicht hast?
 
Doch, ich habe aber einige Variablen die ich verändere um verschiedene Versionen leicht zu exportieren. In der Datei musste ich auch eine Kleinigkeit anpassen (ich habe mir die nötigen Änderungen für die verschiedenen Versionen in einen Kommentar geschrieben) Ob ich dabei eine Zeile gelöscht oder einfach nur auskommentiert hatte weiß ich nicht mehr genau.
 
Naja, wie soll man dir ohne Code sagen was genau da falsch läuft. Die allgemeinen Infos zu einer NPE hast du ja.
Du solltest dir für die nächsten Releases notieren welche Revision du veröffentlicht hast, sonst kommt es zu genau solchen Problemen.
 

Ähnliche Themen

B
Antworten
6
Aufrufe
1.051
jogimuc
J
S
Antworten
0
Aufrufe
593
Sergio13
S
W
  • WuDiDong
Antworten
3
Aufrufe
768
jogimuc
J
Zurück
Oben Unten