Если мы посмотрим на исходный код, то увидим, AsyncTask
и Handler
написаны исключительно на Java. (Однако есть некоторые исключения. Но это не важный момент)
Так что в AsyncTask
или Handler
нет магии. Эти занятия облегчают нашу жизнь как разработчика.
Например: если программа A вызывает метод A (), метод A () может выполняться в другом потоке с программой A. Мы можем легко проверить с помощью следующего кода:
Thread t = Thread.currentThread();
int id = t.getId();
Почему мы должны использовать новый поток для некоторых задач? Вы можете Google для этого. Множество причин, например: тяжелые, продолжительные работы.
Итак, в чем разница между Thread
, AsyncTask
и Handler
?
AsyncTask
и Handler
написаны на Java (внутренне они используют Thread
), поэтому все, что мы можем сделать с Handler
или AsyncTask
, мы можем достичь с помощью Thread
.
Что может Handler
и AsyncTask
реально помочь?
Наиболее очевидная причина - связь между потоком вызывающего и рабочим потоком.
( Поток вызывающего абонента : Поток, который вызывает рабочий поток для выполнения некоторых задач. Поток вызывающего абонента не обязательно должен быть потоком пользовательского интерфейса). Конечно, мы можем взаимодействовать между двумя потоками другими способами, но есть много недостатков (и опасностей) из-за безопасности потоков.
Вот почему мы должны использовать Handler
и AsyncTask
. Эти классы выполняют большую часть работы за нас, нам нужно только знать, какие методы переопределить.
Разница между Handler
и AsyncTask
составляет: Используйте AsyncTask
, когда Резьба вызывающего абонента является Нить пользовательского интерфейса .
Вот что говорится в документе Android:
AsyncTask позволяет правильно и легко использовать поток пользовательского интерфейса. Этот класс
позволяет выполнять фоновые операции и публиковать результаты в пользовательском интерфейсе
поток без необходимости манипулировать потоками и / или обработчиками
Я хочу подчеркнуть два момента:
1) Простое использование потока пользовательского интерфейса (поэтому используйте, когда поток вызывающего абонента является потоком пользовательского интерфейса).
2) Нет необходимости манипулировать обработчиками. (означает: вы можете использовать Handler вместо AsyncTask, но AsyncTask - более простой вариант).
В этом посте есть много вещей, которые я еще не сказал, например: что такое поток пользовательского интерфейса или почему это проще. Вы должны знать некоторые методы каждого класса и использовать его, вы полностью поймете причину.
@: когда вы читаете документ Android, вы увидите:
Обработчик позволяет отправлять и обрабатывать объекты Message и Runnable
связанный с сообщением MessageQueue
Поначалу это описание может показаться странным. Нам нужно только понять, что у каждого потока есть каждая очередь сообщений (например, список дел), и поток будет принимать каждое сообщение и делать это до тех пор, пока очередь сообщений не станет пустой (точно так же, как мы завершим нашу работу и ложимся спать). Таким образом, когда Handler
связывается, он просто отправляет сообщение вызывающему потоку и ожидает обработки.
Complicated? Просто помните, что Handler
может безопасно общаться с вызывающим потоком.