Jakie argumenty są przekazywane do AsyncTask <arg1, arg2, arg3>?

157

Nie rozumiem, co mam tu umieścić i gdzie kończą się te argumenty? Co dokładnie powinienem umieścić i gdzie dokładnie to pójdzie? Czy muszę uwzględnić wszystkie 3, czy mogę dołączyć 1, 2, 20?

scalesort
źródło

Odpowiedzi:

496

Dokumentacja Google dotycząca Androida mówi, że:

Zadanie asynchroniczne jest definiowane przez 3 typy ogólne, nazywane Params, Progress i Result oraz 4 kroki, nazywane onPreExecute, doInBackground, onProgressUpdate i onPostExecute.

Typy ogólne AsyncTask:

Trzy typy używane przez zadanie asynchroniczne są następujące:

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.

Nie wszystkie typy są zawsze używane przez zadanie asynchroniczne. Aby oznaczyć typ jako nieużywany, po prostu użyj typu Void:

 private class MyTask extends AsyncTask<Void, Void, Void> { ... }

Możesz dalej odnieść się: http://developer.android.com/reference/android/os/AsyncTask.html

Lub możesz wyjaśnić, jaką rolę pełni AsyncTask, kierując blog Sankar-Ganesh

Cóż, struktura typowej klasy AsyncTask wygląda następująco:

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

    protected void onPreExecute(){

    }

Ta metoda jest wykonywana przed uruchomieniem nowego Thread. Nie ma wartości wejściowych / wyjściowych, więc po prostu zainicjuj zmienne lub cokolwiek myślisz, że musisz zrobić.

    protected Z doInBackground(X...x){

    }

Najważniejsza metoda w klasie AsyncTask. Musisz umieścić tutaj wszystkie rzeczy, które chcesz zrobić w tle, w innym wątku niż główny. Tutaj mamy jako wartość wejściową tablicę obiektów typu „X” (czy widzisz w nagłówku? Mamy „… extends AsyncTask” To są TYPY parametrów wejściowych) i zwraca obiekt z typu „Z”.

   protected void onProgressUpdate(Y y){

   }

Ta metoda jest wywoływana przy użyciu metody publicProgress (y) i jest zwykle używana, gdy chcesz pokazać postęp lub informacje na ekranie głównym, takie jak pasek postępu pokazujący postęp operacji, którą wykonujesz w tle.

  protected void onPostExecute(Z z){

  }

Ta metoda jest wywoływana po wykonaniu operacji w tle. Jako parametr wejściowy otrzymasz parametr wyjściowy metody doInBackground.

A co z typami X, Y i Z?

Jak można wywnioskować z powyższej struktury:

 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.

Jak nazywamy to zadanie z zewnątrz? Tylko z następującymi dwoma wierszami:

MyTask myTask = new MyTask();

myTask.execute(x);

Gdzie x jest parametrem wejściowym typu X.

Po uruchomieniu zadania możemy dowiedzieć się o jego statusie „z zewnątrz”. Korzystanie z metody „getStatus ()”.

 myTask.getStatus();

i możemy otrzymać następujący status:

RUNNING - wskazuje, że zadanie jest uruchomione.

PENDING - wskazuje, że zadanie nie zostało jeszcze wykonane.

FINISHED - wskazuje, że onPostExecute (Z) został zakończony.

Wskazówki dotyczące korzystania z AsyncTask

  1. Nie wywołuj ręcznie metod onPreExecute, doInBackground i onPostExecute. Jest to wykonywane automatycznie przez system.

  2. Nie można wywołać AsyncTask wewnątrz innego AsyncTask lub Thread. Wywołanie metody należy wykonać w wątku interfejsu użytkownika.

  3. Metoda onPostExecute jest wykonywana w wątku UI (tutaj możesz wywołać inny AsyncTask!).

  4. Parametrami wejściowymi zadania może być tablica Object, w ten sposób możesz umieścić dowolne obiekty i typy.

Kartik Domadiya
źródło
20
Doskonałe wyjaśnienie, koleś
Kalai.G
30
Lepsze niż Google.
Diolor,
25
+1. Członkowie SO, zwróćcie uwagę. TAK właśnie wyjaśniasz. Chociaż jest długi, niezwykle łatwy do zrozumienia. Dziękuję Kartik.
Subby
3
Ładne wyjaśnienie, teraz jestem bardzo jasny co do Asyntask. :) Dzięki Kartik
Reena
2
To wyjaśniło wiele rzeczy, świetna odpowiedź!
Michael,
80

Jestem za późno na przyjęcie, ale pomyślałem, że to może komuś pomóc.

mrid
źródło
7
Ta wizualizacja była niezwykle pomocna. Zacznę używać więcej wizualizacji, takich jak ta, aby pokazać, jak typy i powiązane z nimi zmienne są powiązane ze sobą, gdy przepływ kodu nie jest prosty lub technika lub wzorzec są rzadkie. Mam nadzieję, że inni zrobią to więcej. Dzięki
Kent Lauridsen
Ładne efekty wizualne, czy możesz dodać również dla WeakAsyncTask?
kAmol
1
@kAmol pewno postaram się zrobić dla przepływu WeakAsyncTask, a także
mrid
4
Pewnego dnia oprawię to i powiesię na ścianie, żeby nie musieć wracać do tego wątku w celach informacyjnych.
Matt Robertson
14

Nie komplikuj!

AsyncTaskTo zadanie w tle, która biegnie w wątku tła. Zajmuje wejściowe , wykonuje Postęp i daje wyjście .

tj AsyncTask<Input,Progress,Output>.

Moim zdaniem głównym źródłem nieporozumień jest próba zapamiętania parametrów w pliku AsyncTask.
Kluczem jest nie zapamiętywać .
Jeśli potrafisz sobie wyobrazić, co naprawdę musi zrobić twoje zadanie, napisanie AsyncTaskpoprawnego podpisu byłoby bułką z masłem.
Wystarczy dowiedzieć się, co twój wejściowe , Progress i wyjścia są i będzie dobrze iść.

Na przykład: wprowadź opis obrazu tutaj

Serce AsyncTask!

doInBackgound()metoda jest najważniejszą metodą w pliku AsyncTaskponieważ

  • Tylko ta metoda działa w wątku w tle i publikuje dane w wątku interfejsu użytkownika.
  • Jego podpis zmienia się wraz z AsyncTaskparametrami.

Zobaczmy więc związek

wprowadź opis obrazu tutaj

doInBackground()a onPostExecute(), onProgressUpdate()są również związane

wprowadź opis obrazu tutaj

Pokaż mi kod
Jak więc napiszę kod 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
      }

}

Jak wykonasz to zadanie

new DownLoadTask().execute("Paradise.mp3");
Rohit Singh
źródło
1
// show in spinner, access UI elementsbyło po prostu najprostszym wyjaśnieniem onProgressUpdate(...):)
Volkan Güven
5

Skorzystaj z poniższych łączy:

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

Nie możesz przekazać więcej niż trzech argumentów, jeśli chcesz przekazać tylko 1 argument, użyj void dla pozostałych dwóch argumentów.

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


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

Zadanie asynchroniczne jest definiowane przez obliczenia, które są uruchamiane w wątku w tle i których wynik jest publikowany w wątku interfejsu użytkownika. Zadanie asynchroniczne jest definiowane przez 3 typy ogólne, zwane Params, Progress i Result oraz 4 kroki, nazywane onPreExecute, doInBackground, onProgressUpdate i onPostExecute.

KPBird

Ketan Parmar
źródło
3
  • w skrócie, w AsyncTask są 3 parametry

    1. parametry do użycia wejściowego w DoInBackground (parametry String ...)

    2. parametry pokazujące stan postępu użycia w OnProgressUpdate (String ... status)

    3. parametry do wykorzystania wyników w OnPostExcute (String ... result)

    Uwaga: - [Typ parametrów może się różnić w zależności od wymagań]

Chinki Sai
źródło