Если мы посмотрим на исходный код, мы увидим, что 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 - более простой вариант).
В этом посте есть много вещей, которые я еще не сказал, например: что такое UI Thread или почему это проще. Вы должны знать некоторые методы, лежащие в основе каждого класса, и использовать их, вы полностью поймете причину.
@: когда вы прочтете документ Android, вы увидите:
Обработчик позволяет отправлять и обрабатывать объекты Message и Runnable, связанные с MessageQueue потока.
Поначалу это описание может показаться странным. Нам нужно только понять, что в каждом потоке есть каждая очередь сообщений (например, список дел), и поток будет принимать каждое сообщение и делать это до тех пор, пока очередь сообщений не станет пустой (точно так же, как мы заканчиваем нашу работу и ложимся спать). Итак, когда Handler
обменивается данными, он просто передает сообщение вызывающему потоку и ожидает обработки.
Сложный? Просто помните, что Handler
может безопасно связываться с вызывающим потоком.
person
hqt
schedule
21.03.2012
Handler
не является потоком и ничего не выполняет. Это всего лишь средство для безопасной передачи сообщений из одного потока в очередь сообщений другого потока. Итак, обычно (по крайней мере) два потока все еще должны быть созданы, которые затем могут использовать обработчик, но обработчик не может ничего выполнить сам. - person JimmyB   schedule 23.11.2015