Обработчик против AsyncTask

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

Ответ 1

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

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

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

Ответ 2

Мое правило:

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

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

Ответ 3

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

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

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

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

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

Является ли AsyncTask концептуально ошибочным или я что-то не хватает?

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

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 6

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

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

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

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

AsyncTask = Thread + Handler

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

Пожалуйста, прочитайте больше здесь