Обработчик против AsyncTask - PullRequest
124 голосов
/ 26 марта 2010

Я не совсем понимаю, когда можно выбрать AsyncTask вместо Handler. Скажем, у меня есть код, который я хочу запускать каждые n секунд, что обновит интерфейс. Почему я бы выбрал одно над другим?

Ответы [ 9 ]

73 голосов
/ 26 марта 2010

IMO, AsyncTask был написан для обеспечения удобного и простого в использовании способа выполнения фоновой обработки в приложениях Android, не слишком заботясь о низкоуровневых деталях (потоки, циклы сообщений и т. Д.). Он предоставляет методы обратного вызова, которые помогают планировать задачи, а также легко обновлять пользовательский интерфейс при необходимости.

Однако важно отметить, что при использовании AsyncTask разработчик подчиняется его ограничениям, которые возникли из-за проектных решений, принятых автором класса. Например, Недавно я обнаружил, что существует ограничение на количество заданий, которые можно запланировать с помощью AsyncTasks.

Обработчик является более прозрачным из двух и, вероятно, дает вам больше свободы; поэтому, если вы хотите больше контролировать вещи, вы бы выбрали Handler, иначе AsynTask будет работать просто отлично.

60 голосов
/ 26 марта 2010

Мое правило будет:

  • Если вы делаете что-то изолированное, связанное с пользовательским интерфейсом, например, загружаете данные для представления в списке, продолжайте и используйте AsyncTask.

  • Если вы выполняете несколько повторяющихся задач, например, загружаете несколько изображений, которые должны отображаться в ImageViews (например, загрузка миниатюр) после загрузки, используйте очередь задач с Handler.

18 голосов
/ 13 июля 2013

Всегда старайтесь по возможности избегать использования AsyncTask, в основном по следующим причинам:

  • AsyncTask не гарантированно будет работать, так как система имеет базовый и максимальный размер ThreadPool, и если вы создадите слишком много асинктаск, они в конечном итоге будут уничтожены

  • AsyncTask может автоматически завершаться, даже при запуске, в зависимости от жизненного цикла действия, и вы не можете его контролировать

  • Методы AsyncTask, выполняемые в потоке пользовательского интерфейса, например onPostExecute, могут выполняться, когда действие, на которое он ссылается, больше не отображается или может находиться в другом состоянии макета, например, после изменения ориентации.

В заключение, вы не должны использовать UIThread-связанные методы AsyncTask, что является его основным преимуществом !!! Более того, вы должны выполнять некритическую работу только на doInBackground. Прочтите эту ветку, чтобы узнать больше об этих проблемах:

Действительно ли AsyncTask концептуально несовершенен или я просто что-то упустил?

В заключение попытайтесь использовать IntentServices, HandlerThread или ThreadPoolExecutor вместо AsyncTask, если любая из перечисленных выше проблем может вызывать у вас беспокойство. Конечно, это потребует больше работы, но ваше приложение будет безопаснее.

15 голосов
/ 26 марта 2010

Если вы хотите выполнять вычисления каждые x секунд, вам, вероятно, следует запланировать Runnable для HandlerpostDelayed()), а Runnable должен начаться в текущем потоке пользовательского интерфейса.Если вы хотите запустить его в другом потоке, используйте HandlerThread.AsyncTask проще для нас, но не лучше, чем обработчик.

6 голосов
/ 12 апреля 2012

Обработчик связан с основным потоком приложения. он обрабатывает и планирует сообщения и исполняемые файлы, отправляемые из фоновых потоков в основной поток приложения.

AsyncTask предоставляет простой метод для обработки фоновых потоков с целью обновления пользовательского интерфейса без блокировки его трудоемкими операциями.

Ответ заключается в том, что оба могут быть использованы для обновления пользовательского интерфейса из фоновых потоков, разница будет в вашем сценарии выполнения. Вы можете рассмотреть возможность использования обработчика, если вы хотите публиковать отложенные сообщения или отправлять сообщения в MessageQueue в определенном порядке.

Вы можете рассмотреть возможность использования AsyncTask, если хотите легко и удобно обмениваться параметрами (таким образом, обновляя пользовательский интерфейс) между основным потоком приложения и фоновым потоком.

1 голос
/ 23 августа 2016

AsyncTask предполагает, что вы сделаете что-то в потоке пользовательского интерфейса после завершения некоторой фоновой работы. Кроме того, вы можете выполнить его только один раз (после этого его статус будет FINISHED, и вы получите исключение при попытке выполнить его еще раз). Также гибкость его использования невелика. Да, вы можете использовать THREAD_POOL_EXECUTOR для параллельного выполнения, но усилия могут оказаться не стоящими.

Handler не предполагает ничего, кроме обработки Runnables и Messages. Кроме того, он может быть запущен столько раз, сколько вы хотите . Вы можете сами решать, к какому потоку он должен быть присоединен, как он взаимодействует с другими обработчиками, возможно, создайте их с помощью HandlerThread. Так что он гораздо более гибкий и подходит для повторной работы.

Проверьте различные виды Handler примеров здесь .

0 голосов
/ 20 июля 2018

AsyncTask = Thread + Handler

Обработчик - это механизм, позволяющий работать с очередью сообщений. Он ограничен бетонной нитью с Looper.

Пожалуйста, прочитайте больше здесь - https://blog.mindorks.com/android-core-looper-handler-and-handlerthread-bd54d69fe91a

0 голосов
/ 13 июня 2017

doInBackground - в основном работает в другом потоке. onPostExecute - отправляет результаты в потоке пользовательского интерфейса и внутренне отправляет сообщение обработчику основного потока.Основной поток пользовательского интерфейса уже имеет петлитель и обработчик, связанный с ним.

Так что, по сути, если вам нужно выполнить некоторую фоновую задачу, используйте AsyncTask.Но в конечном итоге, если что-то нужно обновить в пользовательском интерфейсе, он будет использовать обработчик основного потока.

0 голосов
/ 28 февраля 2015

Это лучший вопрос для интервью, который задают. AsyncTask - Они используются для разгрузки потока пользовательского интерфейса и выполнения задач в фоновом режиме. Обработчики - Android dosent имеет прямой способ связи между пользовательским интерфейсом и фоновым потоком. Для отправки сообщения или запуска через очередь сообщений должны использоваться обработчики.

Таким образом, AsyncTasks используются там, где задачи должны выполняться в фоновом режиме, а обработчики используются для связи между пользовательским интерфейсом и фоновым потоком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...