Welche Argumente werden an AsyncTask <arg1, arg2, arg3> übergeben?


Antworten:


496

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, the type of the parameters sent to the task upon execution.
Progress, the type of the progress units published during the background computation.
Result, the type of the result of the background computation.

Nicht alle Typen werden immer von einer asynchronen Aufgabe verwendet. Um einen Typ als nicht verwendet zu markieren, verwenden Sie einfach den Typ Void:

 private class MyTask extends AsyncTask<Void, Void, 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:

private class MyTask extends AsyncTask<X, Y, Z>

    protected void onPreExecute(){

    }

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.

    protected Z doInBackground(X...x){

    }

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.

  protected void 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:

 X  The type of the input variables value you want to set to the background process. This can be an array of objects.

 Y  The type of the objects you are going to enter in the onProgressUpdate method.

 Z  The type of the result from the operations you have done in the background process.

Wie nennen wir diese Aufgabe von einer externen Klasse? Nur mit den folgenden zwei Zeilen:

MyTask myTask = new MyTask();

myTask.execute(x);

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

  1. Rufen Sie die Methoden onPreExecute, doInBackground und onPostExecute nicht manuell auf. Dies erfolgt automatisch durch das System.

  2. 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.

  3. Die Methode onPostExecute wird im UI-Thread ausgeführt (hier können Sie eine andere AsyncTask aufrufen!).

  4. Die Eingabeparameter der Aufgabe können ein Objektarray sein. Auf diese Weise können Sie beliebige Objekte und Typen einfügen.


20
Perfekte Erklärung Alter
Kalai.G

30
Besser als Google.
Diolor

25
+1. SO Mitglieder, beachten Sie. So erklären Sie. Obwohl es langwierig ist, ist es extrem leicht zu verstehen. Vielen Dank, dass Sie Kartik.
Subby

3
Schöne Erklärung, jetzt ist mir Asyntask sehr klar. :) Danke Kartik
Reena

2
Das hat viele Dinge für mich geklärt, tolle Antwort!
Michael

80

Ich bin zu spät zur Party, dachte aber, das könnte jemandem helfen.


7
Dieses Bild war äußerst hilfreich. Ich werde mehr visuelle Darstellungen wie diese verwenden, um zu zeigen, wie Typen und ihre zugehörigen Variablen miteinander verbunden sind, wenn der Codefluss nicht einfach ist oder die Technik oder das Muster ungewöhnlich sind. Ich hoffe, andere werden mehr davon tun. Vielen Dank
Kent Lauridsen

Schöne Grafik, können Sie bitte auch für WeakAsyncTask hinzufügen?
kAmol

1
@kAmol sicher, ich werde versuchen , einen Fluss zu machen WeakAsyncTaskund
MRID

4
Eines Tages werde ich dies einrahmen und an meine Wand hängen, damit ich nicht immer wieder auf diesen Thread als Referenz zurückkommen muss.
Matt Robertson

14

Halte es einfach!

Eine AsyncTaskHintergrundaufgabe, die im Hintergrundthread ausgeführt wird. Es nimmt eine Eingabe , führt den Fortschritt aus und gibt die Ausgabe aus .

dh AsyncTask<Input,Progress,Output>.

Meiner Meinung nach ist die Hauptursache für Verwirrung, wenn wir versuchen, uns die Parameter in der zu merken AsyncTask.
Der Schlüssel ist Nicht auswendig lernen .
Wenn Sie sich vorstellen können, was Ihre Aufgabe wirklich zu tun hat, ist das Schreiben AsyncTaskmit der richtigen Signatur ein Kinderspiel.
Finden Sie einfach heraus, was Ihre Eingabe , Ihr Fortschritt und Ihre Ausgabe sind, und Sie können loslegen.

Beispielsweise: Geben Sie hier die Bildbeschreibung ein

Herzstück der AsyncTask!

doInBackgound()Methode ist die wichtigste Methode in einem AsyncTaskweil

  • Nur diese Methode wird im Hintergrundthread ausgeführt und veröffentlicht Daten im UI-Thread.
  • Die Signatur ändert sich mit den AsyncTaskParametern.

Also lasst uns die Beziehung sehen

Geben Sie hier die Bildbeschreibung ein

doInBackground()und onPostExecute(), onProgressUpdate()auch im Zusammenhang

Geben Sie hier die Bildbeschreibung ein

Zeigen Sie mir den Code.
Wie schreibe ich den Code für DownloadTask?

DownloadTask extends AsyncTask<String,Integer,String>{

      @Override
      public void onPreExecute()
      {}

      @Override
      public String doInbackGround(String... params)
      {
               // Download code
               int downloadPerc = // calculate that
               publish(downloadPerc);

               return "Download Success";
      }

      @Override
      public void onPostExecute(String result)
      {
          super.onPostExecute(result);
      }

      @Override
      public void onProgressUpdate(Integer... params)
      {
             // show in spinner, access UI elements
      }

}

Wie werden Sie diese Aufgabe ausführen?

new DownLoadTask().execute("Paradise.mp3");

1
// show in spinner, access UI elementswar zweifellos die einfachste Erklärung für das onProgressUpdate(...):)
Volkan Güven

5

Siehe folgende Links:

  1. http://developer.android.com/reference/android/os/AsyncTask.html
  2. http://labs.makemachine.net/2010/05/android-asynctask-example/

Sie können nicht mehr als drei Argumente übergeben. Wenn Sie nur ein Argument übergeben möchten, verwenden Sie void für die beiden anderen Argumente.

1. private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> 


2. protected class InitTask extends AsyncTask<Context, Integer, Integer>

Eine asynchrone Aufgabe wird durch eine Berechnung definiert, die auf einem Hintergrundthread ausgeführt wird und deren Ergebnis im UI-Thread veröffentlicht wird. 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.

KPBird


3
  • Kurz gesagt, es gibt 3 Parameter in AsyncTask

    1. Parameter für die Verwendung von Eingaben in DoInBackground (String ... params)

    2. Parameter für die Anzeige des Status des Fortschritts in OnProgressUpdate (String ... Status)

    3. Parameter für die Ergebnisverwendung in OnPostExcute (String ... Ergebnis)

    Hinweis: - [Die Art der Parameter kann je nach Anforderung variieren]

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.