Feststellen, ob Activity angezeigt wird

  • 12 Antworten
  • Letztes Antwortdatum
Q

qwert_zuiopue

Fortgeschrittenes Mitglied
6
Hallo,

ich bekomme folgende Fehlermeldung:
Code:
android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@415ced98 is not valid; is your activity running?
at android.view.ViewRootImpl.setView(ViewRootImpl.java:703)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:453)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:351)
at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:171)
at android.view.Window$LocalWindowManager.addView(Window.java:558)
at android.app.Dialog.show(Dialog.java:282)
at ...

Ich versuche dabei, einen Dialog anzuzeigen. Ich vermute, dass der Fehler dann auftritt, wenn die Activity nicht mehr angezeigt wird, ich aber einen Dialog anzeigen möchte. Kann das sein?
Und wie kann ich das Problem umgehen?

Vielen Dank!
 
Ein bisschen wenig Hintergrund würde nicht schaden.
Die Activity wird doch unter anderem beim Dialog im Konstruktor mitgegben. Wenn es diese nicht gibt, dann kann der Dialog selbstverständlich nicht angezeigt werden! :sleep:
Was ist denn dein Ziel? Du kannst aich eine DialogActivity (oder ähbnlich) erstllen. Damit wird quasi ein Dialog auf Basis einer Activity erstellt... Meine ich zumindest mal gehört zu haben :flapper:
Andernfalls kannst du bei einer Activity das Theme Dialog nehmen xD

Gruß
 
Hintergrund:
Es wird eine Activity gestartet woraufhin eine Datenbankabfrage erfolgt. Ist diese beendet, wird das Ergebnis in einem Dialog angezeigt. Wird zwischenzeitlich durch den Benutzer die App in den Hintergrund geschickt, so tritt die Fehlermeldung auf.

Meine Frage ist eigentlich eine grundsätzlichere: Wie kann ich beim Anzeigen eines jeden beliebigen Dialogs sicher sein, dass ich zu diesem Zeitpunkt den Dialog auch noch anzeigen darf und der Context nicht bereits zerstört wurde?
 
Von wo rufst du denn den Dialog auf?
Der muss doch eigentlich auch aus der Activity heraus aufgerufen werden.

Oder wie meldet sich die Datenbank abfrage zurück?
 
Der Dialog wird von einem Nicht-UI-Thread über einen Handler aufgerufen.
 
Du kannst in der Activity in der onPause ein boolean auf true setzten.
Im Handler fragst du kurz bevor du den Dialog aufurfst diese ab und behandelst dann entsprechend...

Gruß
 
Das war auch mein erster Gedanke. Funktioniert aber nicht, da es zu einer Race-Condition kommen kann, wenn nach dem Abfragen der Variable die Activity beendet wird.
 
Ich weiß ja nicht wie schnell heute CPU's sind. Aber ein:
Code:
if(running) {
   AlertDialog.Builder aBuilder = new AlertDialog.Builder(this);
   aBuilder.setTitle("Hallo");
   aBuilder.setContent("Super Content");
   aBuilder.create().show();
}
Sollte doch so schnell ausgeführt werdn, dass zwischen IF und "this" keiner die App schließen kann *.*

Gruß
 
Naja, es braucht nur der Scheduler dazwischenfunken und schon wird's nicht mehr so schnell ausgeführt und es geht schief ;). Ich schreibe halt ungern Programme, die "wahrscheinlich" funktionieren. Gibt es denn keine saubere Lösung?
 
Einfach so:

Code:
if(this!=null&&aBuilder!=null){
aBuilder.create().show();
}

Ist bei mir noch nie schief gegangen...
 
this kann aber niemals null sein.
Wenn this null wäre, dann bist ja auch gar nicht in der Klasse bzw in dem aktuellen Object weil es gar nicht existiert.
Und wenn aBuilder null wäre würde an der Stelle schon eine NullPointerException fliegen.
Vorallem wenn man gerade vorher das Objekt aBuilder erstellt hat kann das auch nicht null sein, die checks an der Stelle sind also überflüssig
 
Zuletzt bearbeitet:
qwert_zuiopue schrieb:
Naja, es braucht nur der Scheduler dazwischenfunken und schon wird's nicht mehr so schnell ausgeführt und es geht schief ;). Ich schreibe halt ungern Programme, die "wahrscheinlich" funktionieren. Gibt es denn keine saubere Lösung?
Keine Ahnung ob ich bescheuert bin oder etwas falsch versteh :D

Aber wenn du doch quasi hast:
Code:
Thread läuft... Läuft...läuft
App wird geschlosen
Thread läuft.. läauft...
Thread setzte running = false;

if(running)...
Dann wird running nicht mehr ausgeführt und der Dialog demnach auch nicht mehr

Code:
Threaf läuft
App bleibt offen
running = true;

if(running)...
Der Dialog wird angezeogt...

Einzioges proble wäre
Code:
Thread läuft...läuft... läuft
running = true;

if(running)...
App wird geschlosen...
AlertDialog.Builder aBuilder = AlertDialog.Builder(this);
Alleridngs ist das, wie schon erwähnrt, sehr unwahrscineolich :D

Gruß
 
Na gut, ich mache es also so :). Mich interessiert trotzdem ob es hier nicht eine wirkliche Lösung gibt, es könnte ja sicherheitskritische Apps geben...

Keine Ahnung ob ich bescheuert bin oder etwas falsch versteh
Ich vermute mal, dass ich wohl einen Gedankengang übersprungen habe. Also nochmal ausführlich:

Das Problem ist, dass der von dir erwähnte unwahrscheinliche Fall durch den Scheduler wahrscheinlicher wird. Denn:
Code:
Thread läuft...läuft... läuft
running = true;

if(running)...
Scheduler verdrängt Thread
HIER bleibt dann "beliebig" (je nach Scheduler) Zeit, die App zu schließen
App wird geschlosen...
Scheduler lastet Thread wieder ein
AlertDialog.Builder aBuilder = AlertDialog.Builder(this);
 
Zurück
Oben Unten