Ich verwende eine AsyncTask
zum Laden von Operationen, die ich als innere Klasse implementiert habe.
In onPreExecute()
zeige ich einen Ladedialog, in dem ich mich dann wieder verstecke onPostExecute()
. Bei einigen Ladevorgängen weiß ich jedoch im Voraus, dass sie sehr schnell abgeschlossen werden, sodass ich den Ladedialog nicht anzeigen möchte.
Ich wollte dies durch einen booleschen Parameter anzeigen, an den ich übergeben könnte, onPreExecute()
aber anscheinend werden aus irgendeinem Grund onPreExecute()
keine Parameter verwendet.
Die offensichtliche Problemumgehung wäre wahrscheinlich, ein Mitgliedsfeld in meiner AsyncTask oder in der äußeren Klasse zu erstellen, das ich vor jedem Ladevorgang festlegen müsste, aber das scheint nicht sehr elegant zu sein. Gibt es einen besseren Weg, dies zu tun?
quelle
1) Für mich ist dies die einfachste Möglichkeit, Parameter an eine asynchrone Aufgabe zu übergeben
Deklarieren und verwenden Sie die asynchrone Aufgabe wie hier
2) Übergeben von Methoden an die Async-Task Um zu vermeiden, dass die Async-Task-Infrastruktur (Thread, Messagenhandler, ...) mehrmals codiert wird, können Sie die Methoden, die in Ihrer Async-Task ausgeführt werden sollen, als Parameter übergeben. Das folgende Beispiel beschreibt diesen Ansatz. Außerdem müssen Sie möglicherweise die asynchrone Task in eine Unterklasse unterteilen, um die Initialisierungsparameter im Konstruktor zu übergeben.
quelle
Warum, wie und welche Parameter an Asynctask <> übergeben werden, siehe Details hier . Ich denke, das ist die beste Erklärung.
In der Android-Dokumentation von Google heißt es:
Eine asynchrone Aufgabe wird durch drei generische Typen definiert, die als Parameter, Fortschritt und Ergebnis bezeichnet werden, und vier Schritte, die als onPreExecute, doInBackground, onProgressUpdate und onPostExecute bezeichnet werden.
Generische Typen von AsyncTask:
Die drei von einer asynchronen Task verwendeten Typen sind die folgenden:
Params, der Typ der Parameter, die bei der Ausführung an die Task gesendet werden. Fortschritt, der Typ der Fortschrittseinheiten, die während der Hintergrundberechnung veröffentlicht wurden. Ergebnis, der Typ des Ergebnisses der Hintergrundberechnung. Nicht alle Typen werden immer von einer asynchronen Aufgabe verwendet. Um einen Typ als nicht verwendet zu markieren, verwenden Sie einfach den Typ Void:
Sie können weiter verweisen: http://developer.android.com/reference/android/os/AsyncTask.html
Oder Sie können die Rolle von AsyncTask anhand des Blogs von Sankar-Ganesh klären
Nun, die Struktur einer typischen AsyncTask-Klasse sieht folgendermaßen aus:
Diese Methode wird ausgeführt, bevor der neue Thread gestartet wird. Es gibt keine Eingabe- / Ausgabewerte. Initialisieren Sie also einfach Variablen oder was auch immer Sie tun müssen.
Die wichtigste Methode in der AsyncTask-Klasse. Sie müssen hier alle Dinge, die Sie tun möchten, in den Hintergrund stellen, in einen anderen Thread als den Haupt-Thread. Hier haben wir als Eingabewert ein Array von Objekten vom Typ "X" (sehen Sie in der Kopfzeile? Wir haben "... erweitert AsyncTask" Dies sind die TYPEN der Eingabeparameter) und geben ein Objekt vom Typ zurück "Z".
protected void onProgressUpdate (Y y) {
} Diese Methode wird mit der Methode PublishProgress (y) aufgerufen. Sie wird normalerweise verwendet, wenn Sie Fortschritte oder Informationen im Hauptbildschirm anzeigen möchten, z. B. einen Fortschrittsbalken, der den Fortschritt des Vorgangs im Hintergrund anzeigt.
geschützte Leere onPostExecute (Z z) {
} Diese Methode wird aufgerufen, nachdem die Operation im Hintergrund ausgeführt wurde. Als Eingabeparameter erhalten Sie den Ausgabeparameter der Methode doInBackground.
Was ist mit den X-, Y- und Z-Typen?
Wie Sie aus der obigen Struktur ableiten können:
Wie nennen wir diese Aufgabe von einer externen Klasse? Nur mit den folgenden zwei Zeilen:
Wobei x der Eingabeparameter vom Typ X ist.
Sobald wir unsere Aufgabe ausgeführt haben, können wir ihren Status von „außen“ herausfinden. Verwenden der Methode "getStatus ()".
myTask.getStatus (); und wir können den folgenden Status erhalten:
RUNNING - Zeigt an, dass die Aufgabe ausgeführt wird.
PENDING - Zeigt an, dass die Aufgabe noch nicht ausgeführt wurde.
FINISHED - Zeigt an, dass onPostExecute (Z) beendet wurde.
Hinweise zur Verwendung von AsyncTask
Rufen Sie die Methoden onPreExecute, doInBackground und onPostExecute nicht manuell auf. Dies erfolgt automatisch durch das System.
Sie können eine AsyncTask nicht in einer anderen AsyncTask oder einem anderen Thread aufrufen. Der Aufruf der Methode execute muss im UI-Thread erfolgen.
Die Methode onPostExecute wird im UI-Thread ausgeführt (hier können Sie eine andere AsyncTask aufrufen!).
Die Eingabeparameter der Aufgabe können ein Objektarray sein. Auf diese Weise können Sie beliebige Objekte und Typen einfügen.
quelle
Sie können den Parameter entweder im Taskkonstruktor übergeben oder beim Aufrufen execute ausführen:
Der erste Parameter (Objekt) wird in doInBackground übergeben. Der dritte Parameter (MyTaskResult) wird von doInBackground zurückgegeben. Sie können sie in die gewünschten Typen ändern. Die drei Punkte bedeuten, dass null oder mehr Objekte (oder ein Array davon) als Argument (e) übergeben werden können.
quelle