Ich bin sehr neu in der Programmierung und habe einige Zweifel.
Ich habe eine, AsyncTask
die ich als nenne RunInBackGround
.
und ich beginne diesen Prozess wie:
new RunInBackGround().execute();
Ich möchte jedoch warten, bis die Ausführung dieses Aufrufs abgeschlossen ist, bevor ich mit den anderen Codeanweisungen fortfahre.
Wie kann ich das machen?
Gibt es einen Weg dafür?
Antworten:
Sie müssen die AsyncTask.get () -Methode aufrufen , um das Ergebnis zurückzugewinnen, und warten, bis die
doInBackground
Ausführung nicht abgeschlossen ist. aber dies wird Haupt UI - Thread einfrieren , wenn Sie Anruf nicht Methode in einem Thema bekommen .Um das Ergebnis wieder im UI-Thread zu erhalten, beginnen Sie
AsyncTask
wie folgt :quelle
AsyncTask
ohneget
Methode und in AsyncTask wird eineonPostExecute
Methode aufgerufen, die u Ergebnisse auf dem Haupt-UI-Threadawait
inc#
, und natürlich nicht den Haupt-Thread sperrenObwohl es optimal wäre, wenn Ihr Code parallel ausgeführt werden kann, kann es sein, dass Sie einfach einen Thread verwenden, damit Sie den UI-Thread nicht blockieren, selbst wenn der Nutzungsfluss Ihrer App darauf warten muss.
Sie haben hier so ziemlich zwei Möglichkeiten;
Sie können den Code, auf den Sie warten möchten, in der AsyncTask selbst ausführen. Wenn es um die Aktualisierung der Benutzeroberfläche (Thread) geht, können Sie die onPostExecute-Methode verwenden. Dies wird automatisch aufgerufen, wenn Ihre Hintergrundarbeit erledigt ist.
Wenn Sie aus irgendeinem Grund gezwungen sind, dies in Aktivität / Fragment / Was auch immer zu tun, können Sie sich auch einfach zu einem benutzerdefinierten Listener machen, den Sie von Ihrer AsyncTask aus senden. Auf diese Weise können Sie eine Rückrufmethode in Ihrer Aktivität / Fragment / Was auch immer haben, die nur aufgerufen wird, wenn Sie es möchten: auch bekannt als, wenn Ihre AsyncTask mit dem fertig ist, worauf Sie warten mussten.
quelle
Fügen
AsyncTask
Sie in Ihrem ProgressDialog Folgendes hinzu:Sie können die Nachricht
onPreExecute()
wie folgt einstellen :und in Ihrer
onPostExecute(Void result)
Methode entlassen Sie IhreProgressDialog
.quelle
AsyncTask hat vier Methoden.
Sie können Ihre Arbeit aufrufen,
onPostExecute()
nachdem Sie von zurückgekehrt sinddoInBackground()
onPostExecute ist das, was Sie implementieren müssen.
quelle
Ich denke, der einfachste Weg ist, eine Schnittstelle zu erstellen, um die Daten von onpostexecute abzurufen und die Benutzeroberfläche von der Schnittstelle aus auszuführen:
Erstellen Sie eine Schnittstelle:
Dann in asynctask
Dann in Ihrer Haupttätigkeit
quelle