2013-08-28 11 views
99

W interfejsie użytkownika, aby wykonać pewne prace w tle, użyłem oddzielnego Thread. Ale jak sugerują inni, używam teraz AsyncTask.Asynctask vs Wątek w Androidzie

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

W którym scenariuszu powinienem użyć numeru Thread lub AsyncTask?

+4

Zobacz http://stackoverflow.com/a/9800870/2617699 – JavaDM

+0

@ webaldo.at I reffered to, tutaj podali opis i różnicę między Asynctask i Thread.I chcesz wiedzieć, który przypadek na przykład połączenie sieciowe, plik odczytać, co używam ?. – Ram

+0

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

Odpowiedz

113

W przypadku długotrwałych lub intensywnie obciążających procesor zadań można to zrobić na dwa sposoby: wątki Java i natywny AsyncTask systemu Android.

Żadne z nich nie jest lepsze od drugiego, ale wiedza o tym, kiedy należy korzystać z każdego połączenia, jest niezbędna do zwiększenia wydajności systemu z korzyścią dla użytkownika.

Zastosowanie AsyncTask dla:

  1. prostych operacji sieciowych, które nie wymagają pobierania dużej ilości danych
  2. Disk-bound zadań, które może trwać dłużej niż kilka milisekund

Użyj wątków Java dla:

  1. operacje sieciowe, które obejmują umiarkowane do dużych ilości danych (albo przesyłania lub pobierania)
  2. zadań wysoka CPU, które muszą być wykonywane w tle
  3. każde zadanie, w którym chcesz kontrolować użycie procesora w stosunku do GUI wątek

I istnieje wiele dobrych zasobów przez internet, które mogą pomóc:

http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html http://www.mergeconflict.net/2012/05/java-threads-vs-android-asynctask-which.html

+0

Czy mogę zapytać, dlaczego kwota danych do pobrania jest problemem? – Yeung

+1

@Yeung Wydaje się, że potrzebujesz wglądu w Async Task! Spójrz, im większa ilość danych, tym większy czas potrzebny do ukończenia tej samej operacji. Dlatego nie jest dobrą praktyką wykonywanie długiego procesu z Async Task z następujących powodów: 1. Async Task jest słabo związane z cyklem życia Activity. 2. Tworzą one nieszczelności. – Mohit

+3

Spójrz na to: http://stackoverflow.com/questions/12797550/android-asynctask- for-long-running-operations?rq=1 – Mohit

10

gwintu

Wątek jest równoległy jednostką wykonania. Ma własny stos wywołań. Istnieją dwie metody implementacji wątków w aplikacjach.

Jednym z nich jest udostępnienie nowej klasy, która rozszerza wątek i przesłania jego metodę run() . Drugi zapewnia nową instancję wątku za pomocą obiektu Runnable podczas jej tworzenia. Wątek może zostać wykonany przez nazywając jego metodę "start". Możesz ustawić "Priorytet" wątku przez , wywołując jego metodę "setPriority (int)".

Wątek może być użyty, jeśli nie masz wpływu na część interfejsu. Dla przykładu, dzwonisz do niektórych usług internetowych lub pobierasz dane, a po pobraniu wyświetlasz je na swoim ekranie. Następnie musisz użyć Handler'a z wątkiem, co sprawi, że twoja aplikacja będzie trudna do obsłużenia wszystkich odpowiedzi z wątków.

Program obsługi umożliwia wysyłanie i przetwarzanie komunikatów i obiektów wykonanych związanych z właściwością MessageQueue wątku. Każdy wątek ma kolejną wiadomość o kolejce od . (Podobnie jak lista czynności do wykonania), a wątek pobierze każdą wiadomość i przetworzy ją, dopóki kolejka komunikatów nie będzie pusta. Tak więc, gdy Handler komunikuje się, wysyła wiadomość tylko do wątku wywołującego i czeka na przetworzenie.

Jeśli używasz wątki Java to trzeba obsłużyć następujące wymagania w swoim własnym kodzie:

synchronizacja z głównego wątku, jeśli zakładać z powrotem wyniki do interfejsu użytkownika Nie Domyślne anulowania wątku No domyślny wątek łączenie ma domyślnego do obsługi zmian konfiguracyjnych w Androidzie

AsyncTask

AsyncTask umożliwia prawidłowe i łatwe korzystanie z interfejsu th czytać. Ta klasa umożliwia wykonywanie operacji w tle i publikowanie wyników w wątku UI bez konieczności manipulowania wątkami i/lub procedurami obsługi. Zadanie asynchroniczne jest definiowane przez obliczenia działające na wątku tła o numerze , którego wynik jest publikowany w wątku interfejsu użytkownika.

AsyncTask przejdzie 4 następujących etapów:

onPreExecute()

Wykonano wątku UI przed zadaniem jest wykonywany

doInbackground (Params ..)

Wywołuje się na wątku w tle natychmiast po zakończeniu operacji onPreExecute() .

onProgressUpdate (Progress ..)

Wykonano wątku UI po wywołaniu publishProgress (Progress ...).

onPostExecute (Wynik)

Wykonano wątku UI po zakończeniu obliczeń tła.

Dlaczego powinieneś używać AsyncTask?

Łatwy w użyciu dla wątku interfejsu użytkownika. (Tak, użyj go, gdy wątek wywołujący jest wątkiem UI ).

Nie trzeba manipulować uchwytami.

uzyskać więcej informacji odwiedź Here

29

Jeśli używasz wątki Java trzeba obsłużyć następujące wymagania w swoim własnym kodzie:

synchronizacja z głównego wątku, jeśli zakładać z powrotem wyników do interfejs użytkownika

Nie domyślną anulowanie nici

Nie domyślny nici łączenie

Nie domyślną do obsługi zmian konfiguracyjnych w Androidzie

+1

+1 ładny:) ... –

+3

jest to w rzeczywistości bardziej przejrzyste, ponieważ rozwiązuje powody, dla których nie należy używać prostych wątków. Z mojego punktu widzenia wszystko, co musi być powiązane z cyklem życia aktywności/obsługi, powinno zamiast tego korzystać z AsyncTask, mimo że musisz ręcznie "z gracją degradować" zasoby wewnątrz zadania, przynajmniej nie skończysz z zawieszeniem zadania gdy aktywność zostanie zabita. – leRobot

17

Temat

  • czasochłonne zadanie w ogólnym
  • invoke przez thread.start metoda()
  • wyzwolony z dowolny wątek
  • działa na jego własnym wątku
  • instrukcja wątek zarządzanie/code mogą stać się trudne do odczytania

AsyncTask

  • małe zadanie konieczności komunikowania się z głównym wątku
  • invoke metodą excute()
  • wyzwalana od główny wątek
  • działa na wątku pracownika
  • muszą być wykonane i stworzone z głównym wątku
2

Temat:

Thread powinny być stosowane do oddzielenia operacji długo działające od głównego wątku, aby poprawić wydajność. Ale nie można go anulować elegancko i nie może obsłużyć zmian konfiguracji Androida. Nie można aktualizować interfejsu użytkownika od Thread.

AsyncTask moż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. Ale wiele długotrwałych zadań dusi wydajność.

Masz kilka alternatyw dla obu.

HandlerThread/Handler i ThreadPoolExecutor

Patrz poniżej słupka więcej szczegółów:

Handler vs AsyncTask vs Thread