Asynctask vs Thread w systemie Android


135

W interfejsie użytkownika, aby wykonać trochę pracy w tle, użyłem osobnego Thread. Ale jak sugerowali inni, teraz używamAsyncTask .

Jaka jest główna różnica między a Threadi an AsyncTask?

W którym scenariuszu powinienem użyć a Threadczy an AsyncTask?



@ webaldo.at Odniosłem się do tego, tutaj podali opis i różnicę między Asynctask i Thread. Chcę wiedzieć, w którym przypadku na przykład połączenie sieciowe, plik do odczytu tego, czego używam ?.
Ram

Skrócone: Wątek -> Brak dostępu do wątku interfejsu użytkownika || Asynctask -> Warunkowy dostęp do wątku interfejsu użytkownika
JavaDM

dla zadania w tle IntentService to kolejna fajna opcja.
Chen

Odpowiedzi:


146

W przypadku zadań długotrwałych lub wymagających dużej mocy obliczeniowej można to zrobić zasadniczo na dwa sposoby: wątki Java i natywne narzędzie AsyncTask systemu Android.

Żaden z nich nie jest koniecznie lepszy od drugiego, ale wiedza o tym, kiedy należy użyć każdego połączenia, jest niezbędna, aby wykorzystać wydajność systemu na swoją korzyść.

Użyj AsyncTask do:

  1. Proste operacje sieciowe, które nie wymagają pobierania dużej ilości danych
  2. Zadania związane z dyskiem, które mogą zająć więcej niż kilka milisekund

Użyj wątków Java do:

  1. Operacje sieciowe, które obejmują średnie lub duże ilości danych (przesyłanie lub pobieranie)
  2. Zadania wymagające dużej mocy obliczeniowej, które muszą być uruchamiane w tle
  3. Każde zadanie, w którym chcesz kontrolować użycie procesora w stosunku do wątku GUI

W Internecie jest wiele dobrych zasobów, które mogą Ci pomóc:

http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html


Czy mogę zapytać, dlaczego ilość pobieranych danych jest problemem?
Yeung,

1
@Yeung Wygląda na to, że potrzebujesz wglądu w zadanie Async! Spójrz, większa ilość danych to wyraźnie dłuższy czas potrzebny na wykonanie tej samej operacji. Dlatego nie jest dobrą praktyką wykonywanie długotrwałych procesów przy użyciu Async Task z następujących powodów: 1. Async Task jest słabo powiązana z cyklem życia Activity. 2. Tworzą meomoryczne wycieki.
Mohit,


Dziękuję Ci. Teraz rozumiem ryzyko.
Yeung,

@Impasse @Yeung IMO ilość danych nie stanowi problemu, kluczowy problem z operacjami sieciowymi to czas wykonania operacji. Nawet pobranie kilku bajtów może zająć dużo czasu, gdy serwer jest zajęty, nieosiągalny (przekroczenie limitu czasu) itp. Rozwiązaniem może być użycie AsyncTaskwłasnego harmonogramu.
xmedeko

44

Jeśli używasz wątków Java, musisz uwzględnić następujące wymagania we własnym kodzie:

Synchronizacja z głównym wątkiem, jeśli opublikujesz wyniki w interfejsie użytkownika

Brak wartości domyślnej do anulowania wątku

Brak domyślnego buforowania wątków

Brak wartości domyślnej do obsługi zmian konfiguracji w systemie Android


3
jest to właściwie bardziej zrozumiałe, ponieważ dotyczy powodów, dla których nie należy używać prostych wątków. Wydaje mi się, że wszystko, co musi być powiązane z cyklem życia działania / usługi, powinno zamiast tego używać AsyncTask, nawet jeśli musisz ręcznie „z gracją zdegradować” zasoby wewnątrz zadania, przynajmniej nie zakończy się zawieszeniem zadania kiedy aktywność zostaje zabita.
leRobot

28

Wątek

  • Ogólnie długie zadanie
  • Wywołaj metodą thread.start ()
  • Wywoływane z dowolnego wątku
  • Działa we własnym wątku
  • Ręczne zarządzanie wątkami / kod może być trudny do odczytania

AsyncTask

  • Małe zadanie z komunikacją z głównym wątkiem
  • Wywołaj metodą excute ()
  • Wywoływane z głównego wątku
  • Działa w wątku roboczym
  • Musi zostać wykonany i utworzony z głównego wątku

11

Wątek

Wątek to współbieżna jednostka wykonania. Posiada własny stos wywołań. Istnieją dwie metody implementacji wątków w aplikacjach.

Jednym z nich jest zapewnienie nowej klasy, która rozszerza Thread i przesłania jej metodę run (). Drugim jest dostarczenie nowej instancji Thread z obiektem Runnable podczas jej tworzenia. Wątek można wykonać, wywołując jego metodę „start”. Możesz ustawić „Priorytet” wątku, wywołując jego metodę „setPriority (int)”.

Wątek może być używany, jeśli nie masz wpływu na część interfejsu użytkownika. Na przykład dzwonisz do jakiejś usługi internetowej lub pobierasz jakieś dane, a po pobraniu wyświetlasz je na ekranie. Następnie musisz użyć programu obsługi z wątkiem, co skomplikuje obsługę wszystkich odpowiedzi z wątków w aplikacji.

Handler umożliwia wysyłanie i przetwarzanie obiektów Message i Runnable skojarzonych z MessageQueue wątku. Każdy wątek ma każdą kolejkę komunikatów. (Podobnie jak lista zadań do wykonania), a wątek przyjmie każdą wiadomość i przetworzy ją, aż kolejka wiadomości będzie pusta. Tak więc, gdy Handler komunikuje się, po prostu przekazuje wiadomość do wątku wywołującego i będzie czekał na przetworzenie.

Jeśli używasz wątków Java, we własnym kodzie musisz uwzględnić następujące wymagania:

Synchronizacja z wątkiem głównym w przypadku publikowania wyników z powrotem w interfejsie użytkownika Brak wartości domyślnej do anulowania wątku Brak domyślnej puli wątków Brak wartości domyślnej do obsługi zmian konfiguracji w systemie Android

AsyncTask

AsyncTask umożliwia prawidłowe i łatwe korzystanie z wątku interfejsu użytkownika. Ta klasa umożliwia wykonywanie operacji w tle i publikowanie wyników w wątku interfejsu użytkownika bez konieczności manipulowania wątkami i / lub programami obsługi. 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.

AsyncTask przejdzie przez następujące 4 etapy:

onPreExecute ()

Wywoływane w wątku interfejsu użytkownika przed wykonaniem zadania

doInbackground (Params ..)

Wywoływane w wątku w tle natychmiast po zakończeniu wykonywania onPreExecute ().

onProgressUpdate (Progress ..)

Wywoływane w wątku interfejsu użytkownika po wywołaniu metody PublishedProgress (Progress ...).

onPostExecute (wynik)

Wywoływane w wątku interfejsu użytkownika po zakończeniu obliczeń w tle.

Dlaczego warto używać AsyncTask?

Łatwy w użyciu dla wątku interfejsu użytkownika. (Więc używaj go, gdy wątek wywołujący jest wątkiem interfejsu użytkownika).

Nie ma potrzeby manipulowania Handlerami.

Więcej informacji można znaleźć tutaj


2

Wątek:

Threadpowinien być używany do oddzielania długotrwałych operacji od głównego wątku, aby poprawić wydajność. Ale nie można go elegancko anulować i nie radzi sobie ze zmianami konfiguracji Androida. Nie możesz zaktualizować interfejsu użytkownika z Thread.

AsyncTaskmoże być używany do obsługi elementów roboczych krótszych niż 5 ms. Dzięki AsyncTask, możesz zaktualizować interfejs użytkownika w przeciwieństwie do java Thread. Jednak wiele długotrwałych zadań spowolni wydajność.

Masz kilka alternatyw dla nich obu.

HandlerThread / Handler i ThreadPoolExecutor

Więcej informacji znajdziesz w poniższym poście:

Handler vs AsyncTask vs Thread

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.