2011-01-14 12 views
0

Ich habe eine seltsame Situation, die ich sehe.Android: Aktivität schließt im Dialog

ich einige Informationen aus einer Datenbank lese, dann einen Dialog, Erziehung: PSEUDO

val = DBaseManager.readValue(i,POS_ONE); 

if(val == 1) 
{ 
    Dialog_Test myDialog = new 
    Dialog_Test (myContext,"",new addListener(),DBaseManager); 
    myDialog.show(); 
} 

wie Sie ich die DBaseManager gelangen in den Dialog sehen, so können Sie es auch verwenden können.

dann dort in ich es wie folgt verwendet werden:

DBaseManager.readValue(k,POS_TWO); 

usw.

Nun ist diese 99% der Zeit arbeitet, jedoch habe ich zeigen einige Absturzprotokolle mussten diese Zeilen im Dialog mit Nullzeigerausnahmen

Für mich bedeutet dies, dass auf einigen Geräten meine onPause- oder OnDestory-Methoden in der Hauptaktivität aufgerufen werden, die DBaseManager schließt und auf Null setzt. Dies sind 1,6, 2,2 und 2,3 Geräte.

Also ist die Frage warum und wie zu verhindern? Ich habe ein paar Nullzeiger-Checks hinzugefügt, um die Abstürze zu verhindern, aber es ist immer noch alles andere als ideal.

UPDATE: Auf meinen Geräten zumindest wenn ich eine Bildschirmdrehung mache wird die Aktivität neu gestartet und der Dialog verschwindet - könnte es auf manchen der Dialoge bleiben?

Antwort

0

Dies hängt wahrscheinlich vom Umfang Ihres Dialogs ab und davon, in welchem ​​Code Sie ihn öffnen. Das Standardverhalten besteht darin, dass die Aktivität ihren Lebenszyklus durchläuft, wenn sich die Ausrichtung ändert, es sei denn, Sie nehmen Änderungen der Ausrichtung explizit vor und überschreiben onOrientationChanged. Sie möchten beispielsweise den Status Ihres Dialogfelds auf Aktivitätsebene beibehalten (z. B. das Hinzufügen eines booleschen isDialogDisplayed als Klassenvariable) und dann in onCreate oder onResume das überprüfen und das Dialogfeld erneut öffnen.

Soweit das DBaseManager Objekt bereinigt wird, habe ich ähnliche Dinge erlebt. Große Objekte werden aufgeräumt, wenn man sie nicht erwartet (es gibt immer noch Zeiger auf diese Objekte, aber sie wurden vom System irgendwie auf Null gesetzt). Ich habe diese in meinen Anwendungen identifiziert und war vorsichtiger. Anstatt null zu prüfen und nur dann neu zu laden, wenn es möglich ist, dass der Code die Variable auf Null gesetzt hat (oder lazy loading verwendet hat), würde ich dieses Objekt immer so behandeln, als wäre es faul geladen. Fügen Sie eine Methode hinzu, die dieses Objekt zurückgibt, anstatt direkt auf es zuzugreifen, und immer nach Null zu suchen und neu zu laden, falls dies der Fall ist.

Für beide Probleme möchten Sie möglicherweise alle Lebenszyklusmethoden dieser Aktivität überschreiben und sie protokollieren. Vergessen Sie nicht, die Lifecycle-Methoden der Basisklasse innerhalb Ihrer Overrides aufzurufen (zB public void onPause() { super.onPause() ..., etc.)!

+0

Danke, ich denke es ist der zweite Fall mit dem großen Objekt aufgeräumt werden. Ich habe alles außer Kraft gesetzt, kann es aber nicht reproduzieren, es passiert nur im Feld. Ich denke, ich werde eine Util-Routine erstellen, um es zu öffnen, wie es vorgeschlagen wird. – Chris

+0

Das gleiche hier ... Ich bekomme Fehlerberichte aus dem Feld, die ich nicht reproduzieren kann und die ich bei meinen eigenen Tests nie mit der gleichen Art von Verhalten gesehen habe. Unordentliches Zeug. lol – Rich

Verwandte Themen