Asynctask против темы в Android

135

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

В чем главное различие между a Threadи an AsyncTask?

В каком сценарии я должен использовать Threadили AsyncTask?

ОЗУ
источник
@ webaldo.at Я сослался на это, здесь они дали описание ввода и разницу между Asynctask и Thread.Я хочу знать, в каком случае, например, сетевое подключение, чтение файла для того, что я использую ?.
Рам
Сокращено: Тема -> Нет доступа к UI-теме || Asynctask -> условный доступ к
потоку
для фоновой задачи IntentService является еще одним хорошим вариантом.
Чен,
1
Возможный дубликат Handler vs AsyncTask vs Thread
Ciro Santilli 法轮功 16 病 六四 事件 法轮功

Ответы:

146

Для длительных или ресурсоемких задач это можно сделать двумя способами: потоками Java и встроенной в Android AsyncTask.

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

Используйте AsyncTask для:

  1. Простые сетевые операции, которые не требуют загрузки большого количества данных
  2. Дисковые задачи, которые могут занять более нескольких миллисекунд

Используйте потоки Java для:

  1. Сетевые операции, которые включают в себя умеренные и большие объемы данных (загрузка или выгрузка)
  2. Высокопроизводительные задачи, которые нужно запускать в фоновом режиме
  3. Любая задача, где вы хотите контролировать использование процессора относительно потока GUI

И есть много хороших ресурсов через Интернет, которые могут помочь вам:

http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html

Мохит
источник
Могу ли я спросить, почему объем данных загрузки является проблемой?
Yeung
1
@Yeung Похоже, вам нужно понимание Async Task! Посмотрите, чем больше объем данных, тем больше время, затрачиваемое на выполнение той же операции. Поэтому не рекомендуется выполнять длительный процесс с использованием Async Task по следующим причинам: 1. Async Task плохо привязана к жизненному циклу Activity. 2. Они создают утечки памяти.
Мохит
3
Посмотрите на это: stackoverflow.com/questions/12797550/…
Мохит
Спасибо. Теперь я понимаю риск.
Йенг
@Impasse @Yeung ИМО количество данных не проблема, ключевая проблема с сетевыми операциями это время операции. Даже загрузка нескольких байтов может занять много времени, когда сервер занят, недоступен (тайм-аут) и т. Д. Исправление можно было бы использовать AsyncTaskс собственным планировщиком.
xmedeko
44

Если вы используете потоки Java, вы должны выполнить следующие требования в своем собственном коде:

Синхронизация с основным потоком, если вы публикуете результаты обратно в пользовательский интерфейс

Нет по умолчанию для отмены потока

Нет пула потоков по умолчанию

Нет по умолчанию для обработки изменений конфигурации в Android

Тарун Варшней
источник
3
это на самом деле более понятно, потому что оно решает причины, почему бы не использовать простые потоки. На мой взгляд, все, что нужно связать с жизненным циклом Activity / Service, должно вместо этого использовать AsyncTask, даже если вам нужно вручную «изящно ухудшать» ресурсы внутри задачи, по крайней мере, вы не в конечном итоге зависаете с задачей. когда активность убита.
leRobot
28

Нить

  • Долгая задача в общем
  • Вызвать методом thread.start ()
  • Срабатывает из любой темы
  • Работает в своем собственном потоке
  • Ручное управление потоками / код может стать трудным для чтения

AsyncTask

  • Небольшая задача , связанная с основным потоком
  • Вызывать методом excute ()
  • Вызывается из основного потока
  • Работает на рабочем потоке
  • Должен быть выполнен и создан из основного потока
Уманг Котари
источник
11

Нить

Поток - это параллельная единица выполнения. У него есть свой стек вызовов. Существует два способа реализации потоков в приложениях.

Один предоставляет новый класс, который расширяет Thread и переопределяет его метод run (). Другой предоставляет новый экземпляр Thread с объектом Runnable во время его создания. Поток можно выполнить, вызвав его метод «start». Вы можете установить «Приоритет» потока, вызвав его метод setPriority (int).

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

Обработчик позволяет отправлять и обрабатывать объекты Message и Runnable, связанные с MessageQueue потока. Каждый поток имеет каждую очередь сообщений. (Как список дел), и поток будет принимать каждое сообщение и обрабатывать его, пока очередь сообщений не станет пустой. Поэтому, когда обработчик связывается, он просто отправляет сообщение потоку вызывающей стороны и ожидает обработки.

Если вы используете потоки Java, вам необходимо выполнить следующие требования в своем собственном коде:

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

AsyncTask

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

AsyncTask пройдёт следующие 4 этапа:

onPreExecute ()

Вызывается в потоке пользовательского интерфейса перед выполнением задачи

doInbackground (Params ..)

Вызывается в фоновом потоке сразу после завершения выполнения onPreExecute ().

onProgressUpdate (Прогресс ..)

Вызывается в потоке пользовательского интерфейса после вызова publishProgress (Progress ...).

onPostExecute (Результат)

Вызывается в потоке пользовательского интерфейса после завершения фоновых вычислений.

Почему вы должны использовать AsyncTask?

Простота в использовании для потока пользовательского интерфейса. (Таким образом, используйте его, когда поток вызывающего является потоком пользовательского интерфейса).

Нет необходимости манипулировать обработчиками.

Для получения дополнительной информации посетите здесь

Випул Пурохит
источник
2

Нить:

Threadследует использовать для отделения длительных операций от основного потока, чтобы повысить производительность. Но это не может быть отменено элегантно и не может справиться с изменениями конфигурации Android. Вы не можете обновить пользовательский интерфейс с Thread.

AsyncTaskможет использоваться для обработки рабочих элементов длительностью менее 5 мс. С AsyncTask, вы можете обновить пользовательский интерфейс в отличие от Java Thread. Но многие долгосрочные задачи будут подавлять производительность.

У вас есть несколько альтернатив для них обоих.

HandlerThread / Handler и ThreadPoolExecutor

Обратитесь к сообщению ниже для более подробной информации:

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

Равиндра Бабу
источник