Asynctask vs Thread in android

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Нить

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

AsyncTask

  • Маленькая задача, связанная с основной нитью
  • Вызывать метод excute ()
  • Вызывается из основного потока
  • Работает на рабочем потоке
  • Должен быть выполнен и создан из главной темы

Нить

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

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

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

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

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

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

AsyncTask

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

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

onPreExecute ()

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

doInbackground (Params ..)

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

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

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

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

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

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

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

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

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

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

HandlerThread и Handler обеспечивают лучшую альтернативу.

HandlerThread:

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

Обработчик:

Обработчик позволяет отправлять и обрабатывать объекты Message и Runnable, связанные с MessageQueue потока. Каждый экземпляр Handler связан с одним потоком и очереди сообщений потока. Когда вы создаете нового обработчика, он привязан к очереди потоков / сообщений потока, который его создает – с этой точки он будет доставлять сообщения и runnables в очередь сообщений и выполнять их по мере их выхода из сообщения очередь.

После запуска Thread или AsyncTask его нельзя повторно использовать и повторно запускать. Если вы создаете несколько потоков / AsyncTasks, у вас есть накладные расходы на создание потоков и управление жизненным циклом потока.

Но с помощью HandlerThread и Handler (который использует Looper ) вы можете отправлять несколько рабочих заданий с отсутствием служебных издержек производительности. Вы можете повторно использовать Handler для отправки нескольких задач в отличие от Thread/AsyncTask

Посмотрите пример кода в этом сообщении для получения дополнительной информации:

Запуск кода в основном потоке из другого потока