Intereting Posts
Сделайте ImageView с круглым углом Используя пикассо Android Speech Распознавание речи: повторный вызов SpeechRecognizer.startListening () не работает на JB 4.1.2 Как получить исходный код встроенных методов для Android Android – Выполнение остановки активности, которая не возобновляется Android – создайте уведомление, TaskStackBuilder.addParentStack не работает CollapsingToolbarLayout не работает (рушится) при прокрутке Имитировать медленное подключение к Интернету на устройстве REAL? Приемник вещания для Android не получает намерения Android AppBarLayout перекрывает список просмотров Как создать обфускационный файл jar? Как я могу использовать listview без расширения ListActivity в моем классе? Лучший способ форматирования входных данных в формате TextText? Android: используйте инструкцию SWITCH с помощью setOnClickListener / onClick для более чем 1 кнопки? Новый для android нужно понимать "? Android: attr / actionBarSize" Панель инструментов внутри CardView для создания всплывающего меню (значок переполнения)

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

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

Solutions Collecting From Web of "Обработчик против AsyncTask"

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

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

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

Мое правило:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ознакомьтесь с примерами примеров Handler .

DoInBackground – в основном работает в другом потоке. OnPostExecute – публикует результаты в потоке пользовательского интерфейса и отправляет внутреннее сообщение обработчику основного потока. В основном потоке пользовательского интерфейса уже есть связанный с ним петлевой механизм и обработчик.

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