AsyncTask umożliwia wykonanie zadania w tle i publikowanie stanu pracy w interfejsie użytkownika bez konieczności manipulowania wątkami. Jest zaprojektowany jako klasa pomocnicza wokół klasy Thread i Handler. Wykorzystywany przede wszystkim do krótkich jednorazowych operacji powiązanych z bieżącym ekranem, które wymagają przetworzenia rezultatu na wątku głównym aplikacji. Dostarcza prosty w obsłudze interfejs co zwalnia programistę z obowiązku zajmowania się obsługą wątków (roboczego i głównego).
Implementacja
Aby stworzyć zadanie asynchroniczne należy rozszerzyć klasę AsyncTask oraz nadpisać przynajmniej metodę doInBackground odpowiedzialną za wykonywanie zadania na wątku roboczym. Pozostałe metody onPreExecute, onProgressUpdate, onPostExecute, onCancelled są wykonywane na głównym wątku dla różnych stanów zadania. Częstą praktyką jest implementacja klasy AsyncTask jako klasy wewnętrznej (inner class) w kontekście wywołania. Rozpoczęcie wykonywania zadania odbywa się przy pomocy metody execute.
Ograniczenia
Implementacja klasy AsyncTask jako klasy wewnętrznej może powodować wycieki pamięci (leak memmory). Instancja takiej klasy przechowuje referencje do klasy zewnętrznej (np. Activity, Fragment) niezależnie od stanu cyklu życia obiektu klasy zewnętrznej co powstrzymuje Garbage Collector przed usunięciem referencji. Aby temu zapobiec należy stworzyć klasę jako statyczną wewnętrzną (static inner), zagnieżdżoną (nested) lub na poziomie top-level. W przypadku wymaganej referencji do Activity warto posłużyć się słabą referencją WeakReference lub przekazać obiekt Listener implementujący oczekiwane zachowanie interfejsu użytkownika.
Ponadto należy również zwrócić uwagę na fakt iż tak skonstruowane zadanie nie przetrwa zmiany konfiguracji co będzie skutkowało utratą aktualnego progresu. Aby temu zapobiec można umieścić obiekt AsyncTask w obiekcie Fragment z ustawionym setRetainInstance(true) lub w ViewModel. Co więcej, AsyncTask jest zadaniem jednorazowym i każde jego ponowne wywołanie wymaga nowej instancji w związku z czym warto zadbać o odpowiednią obsługę stanu zadania w zależności od cyklu życia. Ogranicza również komunikację z innymi zadaniami współbieżnymi wykonywanymi na innych wątkach.