Frage

Ich verwende ein AsyncTask Unterklasse für einige Hintergrundverarbeitung.Das Problem ist, dass, wenn ich die Klasse mit dem verwende .get() Methode, die ProgressDialog Ich spezifiziere in der onPreExecute() zeigt nicht.

Ich arbeite gut, wenn ich einen Rückruf innerhalb des verwende onPostExecute() Methode.

Mein erster Gedanke war, dass das daran lag .get() wartet darauf, dass der Prozess abgeschlossen ist, aber das kann auch nicht den UI-Thread blockieren, also ist das nicht der Fall.

Kann jemand erklären, warum dieses Verhalten so ist und ob es dafür einen Workaround gibt?Ich würde das wirklich gerne nutzen .get() Methode, wenn ich kann.

War es hilfreich?

Lösung

Ich habe zunächst die andere Antwort akzeptiert, aber sie scheint falsch zu sein.

Der .get() -Methode blockiert den UI-Thread, um auf das Ergebnis zu warten, und alle angezeigten Dialoge werden ebenfalls blockiert.Dies ist das erwartete Verhalten für diese Methode.

Die einzige Alternative besteht darin, es nicht zu verwenden .get() wenn die Hintergrundaktivität für eine nennenswerte Zeitspanne andauert, und verwenden Sie stattdessen Rückrufmethoden für die aufrufende Aktivität.

Andere Tipps

Berufung AysncTask.get() im UI-Thread blockiert die Ausführung des UI-Threads und lässt den UI-Thread auf den Abschluss von AysncTask.doInBackground() warten.Auf diese Weise verzichten Sie tatsächlich auf die Vorteile von AsycnTask. Der gesamte Code wird jetzt synchron im UI-Thread und im Hintergrund-Thread ausgeführt (immer noch zwei Threads, aber der UI-Thread wartet jetzt auf den Hintergrund-Thread).

Bedenken Sie auch, dass Sie wahrscheinlich eine ANR-Ausnahme (länger als 5 Sekunden blockiert) erhalten, wenn Sie get() im UI-Thread aufrufen.

Wenn Sie es wirklich verwenden müssen, rufen Sie Ihre showDialog()-Methode vor myAsyncTask.get() auf:

showDialog();
myAsyncTask.execute();
myAsyncTask.get(); // <-- UI thread blocked and wait at this point.
dismissDialog();// <-- This line will be executed after doInBackground() finish.

Hoffe das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top