Asynctask vs Thread in android

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

В чем основное отличие между Thread и AsyncTask?

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

Ответ 1

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

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

Использовать AsyncTask для:

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

Использовать потоки Java для:

  • Сетевые операции, которые включают в себя данные с умеренными или большими объемами (загрузка или загрузка)
  • Задачи с высоким процессором, которые нужно запускать в фоновом режиме
  • Любая задача, в которой вы хотите контролировать использование ЦП относительно потока GUI

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

http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html http://www.mergeconflict.net/2012/05/java-threads-vs-android-asynctask-which.html

Ответ 2

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

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

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

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

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

Ответ 3

Тема

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

AsyncTask

  • небольшая задача, связанная с основным потоком
  • invoke методом excute()
  • запускается из основного потока
  • работает в рабочем потоке
  • должен быть выполнен и создан из основного потока

Ответ 4

Тема

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

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

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

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

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

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

AsyncTask

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

AsyncTask будет проходить следующие 4 этапа:

onPreExecute()

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

doInbackground (Params..)

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

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

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

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

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

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

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

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

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

Ответ 5

Тема:

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

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

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

HandlerThread/Handler и ThreadPoolExecutor

Подробнее см. ниже:

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