AlertDialog Timing

  • 20 Antworten
  • Letztes Antwortdatum
GENiALi

GENiALi

Fortgeschrittenes Mitglied
11
Hallo

Einem AlertDialog muss man den aktuellen Context mitgeben. Context ist in dem Fall ja die Activity.

Jetzt kann es aber vorkommen das ich die Activity A aufrufe. Dort wird einiges initialisiert und festgestellt, dass man den Dialog anzeigen muss. Im Hintergrund wird aber gleichzeitig noch weiter gearbeitet und entschieden das ich auf Activity B wechseln muss. Dann kann es vorkommen dass das show() auf dem AlertDialog angezeigt werden soll wenn die Activity A schon nicht mehr existiert. Das macht dann boom und die App schmiert ab.

Gibt es eine Lösung um Dialoge anzuzeigen OHNE auf die aktuelle Aktivity angewiesen zu sein?

OK. Man könnte jetzt den Dialog besser im Code plazieren damit die Logik wieder passt. Aber das kann zu abartig tief verschachteltem Code führen das es nicht mehr spassig ist.
 
und wenn du die show Methode überschreibst und der dann halt den aktuellen context übergibst von der aus er aufgerufen wird?

und als zusatz könntest du ja noch eine null Prüfung einfügen um ungewünschte Nebeneffekte aus dem weg zu gehen.
 
Nur, der Context ist ja schon gesetzt wenn show aufgerufen wird. Und neu setzten geht auch nicht. Habe keine Methode gefunden um den Context zu tauschen. Oder verstehe ich dich nicht ganz? :-/
 
Schonmal mit dem Application-Context probiert?

Wobei das wohl auch nicht funktionieren wird. Wenn mich nicht alles täuscht, würde ja der AlertDialog "leaken", sobald die ursprüngliche Activity nicht mehr existiert (Vermutung, nicht getestet)...

Was wird denn in dem Dialog angezeigt? Reicht es ggf. auf Toast auszuweichen? Oder ansonsten eine eigene Activity nur für den Dialog? Letzteres sollte ja kein Problem geben, weil das ja dann einfach eine neue Activity ist, die über die alte gelegt wird und somit vollkommen unabhängig davon ist, von welcher Activity er getriggert wird.
 
reneph schrieb:
Wenn mich nicht alles täuscht, würde ja der AlertDialog "leaken", sobald die ursprüngliche Activity nicht mehr existiert (Vermutung, nicht getestet)...

Genau. Das leaken kommt dann. Toast alleine reicht nicht.
 
Na dann bleibt ja wohl wahrscheinlich nicht viel anderes übrig, als eine eigene Activity für den AlertDialog zu bauen, was vermutlich auch das sauberste wäre, wenn über mehrere Activities hinweg damit interagiert werden können soll.
 
GENiALi schrieb:
Nur, der Context ist ja schon gesetzt wenn show aufgerufen wird. Und neu setzten geht auch nicht. Habe keine Methode gefunden um den Context zu tauschen. Oder verstehe ich dich nicht ganz? :-/

was mich jetzt verwirrt ist folgendes:

GENiALi schrieb:
Hallo

... Activity A aufrufe. Dort wird einiges initialisiert und festgestellt, dass man den Dialog anzeigen muss.

an sich kein Problem, wenn "allesOK" mach weiter, wenn "nichtAllesOk" showDialog

GENiALi schrieb:
Im Hintergrund wird aber gleichzeitig noch weiter gearbeitet und entschieden das ich auf Activity B wechseln muss. Dann kann es vorkommen dass das show() auf dem AlertDialog angezeigt werden soll wenn die Activity A schon nicht mehr existiert. Das macht dann boom und die App schmiert ab.

Das dürfte doch so an sich nicht möglich sein, entweder verschwindet der Dialog wird quasi von Activity B überdeckt (Stack) oder die Activity B wird gar nicht aufgerufen weil der Dialog das "weiter machen" blockiert.

Ich weiß halt nicht warum er dann plötzlich die Activity wechseln muss sofern du ja motivation zeigst das der User mittels einen Dialog die fehlenden Daten eintragen kann, wenn er aufgrund fehlender Daten gleich die Activity wechseln muss dann stimmt etwas an deinen Design nicht, weil was wird auf der zweiten Activity gezeigt?

Weil wenn ich das nun richtig verstehe wechselt er die Activity um fehlende Daten nach zutragen, wenn er die Activity wechselt aus den Grund das er auch ohne diese Daten auskommt und weiter machen kann, brauch man kein Dialog, bzw kann in der Abarbeiten (Hintergrund aktion wo der wechsel stattfindet) eine Abfrage einbauen ob der Benutzer die fehlenden Daten eintragen will oder die Activity wechseln will.
 
Madlip schrieb:
Das dürfte doch so an sich nicht möglich sein, entweder verschwindet der Dialog wird quasi von Activity B überdeckt (Stack) oder die Activity B wird gar nicht aufgerufen weil der Dialog das "weiter machen" blockiert.

show ist ja nicht blokierend. Wenn du dann den builder.crate().show() aufrufst läuft die Aktivitiy A noch weiter. Wenn dann aber die Logik schnell genaug ist und Aktivity A schon die B gestartet hat vermisst der Dialog halt seinen Context.

Das ist ein Punkt wo mir das immer wieder passiert. Ein anderer ist: Ich habe einen Service der mir Daten updated. Der muss dann ein Progress anzeigen. Nur, wie öffne ich aus einem Service einen Dialog? Auch hier wäre eine Fake Aktivity praktisch. Im moment habe ich es mit Interfaces gelöst. In meiner BaseActiviy können dann ein paar Methoden vom Service aus getrigert werden und ich Zeige dabei den Progress an. Tut einwandfrei, in 95% der Fälle. Aber ab und zu bekomme ich auch wieder Meldung das der Context eben weg sei.
 
ja das mit den service ist die eine sache aber lass uns erstmal bitte bei dein ersten Problem bleiben.

Bitte erkläre mir die Sinnhaftigkeit - während die von User noch Daten erwartest die Activity zu wechseln?
 
Ich Zeige dem User z.B. eine Infos an. Die MUSS er lesen und ich darf kein Toast nehmen. Ich will aber nicht alles blokieren bis er auf OK geklickt hat. Und nun kann es vorkommen, da ich nicht blokiere, dass im Hintergrund, aus irgend einem Verarbeitungsschritt heraus, die Activity getauscht wird. Und schon gibts ärger.

Aber wie du richtig sagst. Mann könnte ja weiter machen wenn auf OK gelickt wird. Aber das verschachtelt den Code so dermassen, wenn man das ein paar mal machen muss, dass es einfach ein Wartungshorror wird. Zudem kommt der Dialog nicht jedesmal.

Aber so langsam aber sicher muss ich mir den Wartungshorror antun und das Zeugs verschachteln.

Mir wäre es am liebsten wenn die Dialoge nicht einen Activity Context bräuchten sondern z.B. nur den ApplicationContext. Dann würde das nicht passieren. So wie bei den Toast. Dort kann man die Activity austauschen so viel man will. Ohne Fehler. Bei den Dialogen wäre das auch supper.
 
Hmmm, würde mich doch eher überraschen wenn das mein Problem lösen würde. Der AlertDialog wird noch immer mit AlertDialog.Builder(this); erstellt. Die Exception kommt aber nicht vom OK Event sondern vom alert.show();.
Muss mir das aber mal genauer anschauen.
 
es geht ja viel mehr darum das du deine verarbeitung die im hintergrund passiert erst einmal stoppst so lange der user nicht auf ok gedrückt hat und das wirst du mittels den handler machen können. halt mich (uns) auf jeden Fall mal bitte auf den laufenden ob es geklappt hat.
 
Ah, so meinst du das. Dazu habe ich schon Modale Dialog die genau das machen.
Nur sieht der Code in dem Beispiel besser aus.
 
ok, dann hauts ja hin.
 
@Madlip Hast du ne Idee wie man aus einem Service einen Dialog öffnen kann? Wenn ja, dann mache ich einen neuen Thread auf.
 
Ich weiss das Android das nicht will. Ich stosse immer mal wieder auf solche Restriktionen. Aber wie soll ich sonst einen Fortschritt in einem Service dem User visualisieren?

Das laden der Daten, ziemlich umfangreich, läuft in einem Service ab. Somit kann ich den jederzeit ankicken. Aber dabei muss ich auch dem User eine Statusanzeige anbieten. Er muss sehen WAS geladen wird, OB erfolgreich oder nicht u.s.w.
 
Dann muss der Service in ein AsyncTask laufen dann kannst du eine Progressbar anzeigen, dabei solltest du ja auch sagen können - Erfolgreich abgeschlossen oder es gab Probleme.
 
OK. Habe jetzt so einiges Versucht. Die einfachste Lösung war, damit ich es von überall her aufrufen kann, eine Klasse die Runnable implementiert. Im Ctor gebe ich dann die aufrufende Activty mit und arbeite dann nur mit der. Bei jeder Ausgabe nutze ich dann context.runOnUiThread().

Soweit so gut. Es tut und die Fehlermeldung konnte ich bis jetzt nicht mehr reproduzieren. :)
 
Zurück
Oben Unten