Toast in einem Async-Task anzeigen

  • Antworten:8
  • Bentwortet
p a
  • Forum-Beiträge: 131

24.11.2011, 09:36:41 via Website

Hi,
hat mal jemand eine Idee wie ich aus einem Toast heraus einen Async .... ach Quatsch, umgekehrt.
... wie ich aus einem AsyncTask heraus einen Toast anzeigen kann.

Er will ja dafür dieses Looper.prepare() haben (was auch immer das ist), aber wenn ich das aufrufe zeigt er mir keinen Toast an.
Bin schon soweit dass ich weiss dass ich es in onProgressUpdate packen muss, aber mein Problem ist halt dass der Toast eine Fehlermeldung ausgeben soll wenn beim Ausführen von dem Task eine Exception ausgelöst wird.
Jetzt hab ich aber keine Ahnung wie ich im onProgressUpdate an die Exception komme die geworfen wird.

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

24.11.2011, 10:15:24 via Website

naja wenn du einen fehler hast, um so einen toast anzuzeigen, dann wird dein asynctask ja fertig sein, sprich onPostExecute()

dort kannst du deinen toast einfach starten

swordiApps Blog - Website

Antworten
p a
  • Forum-Beiträge: 131

24.11.2011, 10:35:51 via Website

ahja ...
etwas tricky, aber so ...
1protected Boolean doInBackground(Void... params)
2 {
3 try
4 {
5 jsonLaden("version");
6 netzwerk = liesJsonVersionen();
7 lokal = Datenbank.getVersionen();
8 versionenAktualitätsArray = lokal.vergleich(netzwerk);
9 return true;
10 }
11 catch (Exception exc)
12 {
13 context.runOnUiThread(new Runnable()
14 {
15 public void run()
16 {
17 Toast.makeText(context, "Bitte prüfen sie ihre Netzwerkverbindung", Toast.LENGTH_LONG).show();
18 }
19 });
20 cancel(true);
21 context.finish();
22 Log.v("### " + this.toString(), "Fehler in Versionen", exc);
23 return false;
24 }
25 }

hat es jetzt geklappt

Antworten
p a
  • Forum-Beiträge: 131

24.11.2011, 10:43:03 via Website

Kommt auf den grad der Komplexität an ob sich der Auswand lohnt.
Bin selbstverständlich immer für Optimierungsvorschläge zu meinem Code offen.

edit:
Auswand ist selbstverständlich kein Tippfehler, sondern eine kurze Aussenwand, wie man sie zum Beispiel bei Abstellräumen verwendet. Über den genauen Kontext in diesem Post muss ich mir noch kurz Gedanken machen, bis dahin schadet es aber nicht wenn man Auswand einfach als Aufwand liest ;)

— geändert am 24.11.2011, 10:44:43

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

24.11.2011, 10:56:24 via Website

Kleine Anmerkung noch :)

Ich persönlich finde Fehlermeldungen als Alert sinnvoller.
Das bleibt stehen und das muss man wegklicken.

Ein Toast ist kurz zu sehen und dann weg.
Legt man das Handy kurz zur Seite, weil es grade Daten lädt, verpasst man evtl. eine Fehlermeldung und wundert sich als User dann warum es nicht geklappt hat.

Ich nehme Toasts daher nur für Hinweise die die Bedienung erleichtern, Erfolgsmeldungen, etc.
Für Fehlermeldungen immer AlertDialog.

Antworten
Florian B.
  • Forum-Beiträge: 284

24.11.2011, 11:08:47 via Website

Rafael K.
Ja tricky und unsauber ;)

Im Grunde wäre Markus Hinweis sauberer, dazu müsstest du aber einen komplexeren Typ als Boolean im doInBackground() zurückgeben.

Braucht man gar nicht. Einfach cancel() in doInBackground() aufrufen sobald ein Fehler passiert. Und dann den Toast oder Dialog aus der onCancelled() Methode anzeigen. Die läuft ja dann wieder auf dem UI Thread.

— geändert am 24.11.2011, 11:09:02

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

24.11.2011, 11:40:14 via Website

Florian B.
Rafael K.
Ja tricky und unsauber ;)

Im Grunde wäre Markus Hinweis sauberer, dazu müsstest du aber einen komplexeren Typ als Boolean im doInBackground() zurückgeben.

Braucht man gar nicht. Einfach cancel() in doInBackground() aufrufen sobald ein Fehler passiert. Und dann den Toast oder Dialog aus der onCancelled() Methode anzeigen. Die läuft ja dann wieder auf dem UI Thread.
Auch da muss man die Information transportieren, welcher Fehler aufgetreten ist und der Task ist nicht mehr cancellable.
(Nur im hier vorliegenden Beispiel wäre es egal, weil global Exception gefangen wird)

Ich habs bei mir so gelöst, dass ich bei doInBackground() ein komplexes Objekt mit einem Status zurückgebe, der durch einen enum realisiert ist.
Dann kannst du in onPostExecute mit einer switch Anweisung auf die jeweiligen Statuus reagieren.

— geändert am 24.11.2011, 11:44:48

Antworten