Jeśli spojrzymy na kod źródłowy, zobaczymy AsyncTask
i Handler
jest napisany wyłącznie w Javie. (Są jednak wyjątki. Ale to nie jest ważny punkt)
Więc nie ma magii w AsyncTask
lub Handler
. Zajęcia te ułatwiają nam życie jako programista.
Na przykład: jeśli program A wywołuje metodę A (), metoda A () może działać w innym wątku z programem A. Możemy łatwo zweryfikować, wykonując następujący kod:
Thread t = Thread.currentThread();
int id = t.getId();
Dlaczego powinniśmy używać nowego wątku do niektórych zadań? Możesz go znaleźć w Google. Wiele powodów, np .: ciężkie podnoszenie, długotrwałe prace.
Więc, jakie są różnice między Thread
, AsyncTask
i Handler
?
AsyncTask
i Handler
są napisane w Javie (wewnętrznie używają a Thread
), więc wszystko, co możemy zrobić z, Handler
lub też AsyncTask
możemy osiągnąć, używając Thread
też.
Co może Handler
i AsyncTask
naprawdę może pomóc?
Najbardziej oczywistym powodem jest komunikacja między wątkiem wywołującym a wątkiem roboczym. ( Wątek dzwoniącego : Wątek, który wywołuje Wątek roboczy w celu wykonania niektórych zadań. Wątek dzwoniącego niekoniecznie musi być wątkiem interfejsu użytkownika). Oczywiście możemy komunikować się między dwoma wątkami na inne sposoby, ale istnieje wiele wad (i niebezpieczeństw) ze względu na bezpieczeństwo wątków.
Dlatego powinniśmy użyć Handler
i AsyncTask
. Klasy te wykonują za nas większość pracy, musimy tylko wiedzieć, które metody zastąpić.
Różnica między Handler
i AsyncTask
to: Użyj, AsyncTask
gdy wątek dzwoniącego jest wątkiem interfejsu użytkownika . Tak mówi dokument Android:
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
Chcę podkreślić dwie kwestie:
1) Łatwe korzystanie z wątku interfejsu użytkownika (więc użyj, gdy wątkiem wywołującym jest wątek interfejsu użytkownika).
2) Nie trzeba manipulować programami obsługi. (oznacza: Możesz użyć modułu obsługi zamiast AsyncTask, ale AsyncTask jest łatwiejszą opcją).
W tym poście jest wiele rzeczy, których jeszcze nie powiedziałem, na przykład: co to jest wątek interfejsu użytkownika lub dlaczego jest to łatwiejsze. Musisz znać metody każdej klasy i korzystać z niej, w pełni zrozumiesz powód.
@: kiedy czytasz dokument Androida, zobaczysz:
Moduł obsługi umożliwia wysyłanie i przetwarzanie obiektów Message i Runnable powiązanych z MessageQueue wątku
Ten opis może początkowo wydawać się dziwny. Musimy tylko zrozumieć, że każdy wątek ma każdą kolejkę wiadomości (jak lista rzeczy do zrobienia), a wątek weźmie każdą wiadomość i zrobi to, dopóki kolejka wiadomości nie będzie pusta (tak jak kończymy naszą pracę i kładziemy się spać). Tak więc, gdy się Handler
komunikuje, po prostu wysyła wiadomość do wątku dzwoniącego i będzie czekał na przetworzenie.
Skomplikowane? Pamiętaj tylko, że Handler
może bezpiecznie komunikować się z wątkiem dzwoniącego.
Handler
nie jest wątkiem i niczego nie wykonuje. To tylko sposób na bezpieczne przekazywanie wiadomości z jednego wątku do kolejki komunikatów innego wątku . Tak więc normalnie (przynajmniej) muszą zostać utworzone dwa wątki, które mogą następnie używać modułu obsługi, ale moduł obsługi nie może samodzielnie wykonać niczego.