Сравнение производительности: AsyncTasks vs Threads

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

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

Теперь мой вопрос в том, какой из них лучше – AsyncTask или Thread .

Я знаю, что AsyncTask использует threadpool для выполнения фоновых задач, но в моем случае он будет вызываться только один раз. Поэтому я не думаю, что это создаст проблемы.

Может кто-то пролить свет на него. Какой из них следует использовать для повышения производительности?

Примечание: Оба вызываются в моей деятельности, например, из UI потока.

Может кто-то пролить свет на него. Какой из них следует использовать для повышения производительности?

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

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

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

Обычно, если какая-либо задача длится более 5 секунд, вы должны сообщить USER что

«Что-то работает на заднем плане, подождите, пока оно будет закончено»

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

Итак, и в конце моей души:

Какой из них следует использовать для повышения производительности?

Полностью правильный ответ, я думаю, вы не можете получить, потому что у каждого разработчика есть разные впечатления, разные стили кодирования. Как я уже упоминал, их производительность не отличается. Я думаю, что это то же самое (если вы будете читать файл размером 50 МБ, то не будет быстрее читать ни собственный нить, ни AsyncTask). Это снова зависит от характера задачи и вашего личного выбора.

Обновить:

Для задач, которые могут длиться намного дольше, вы можете попытаться также подумать об инструментах API , предоставляемых пакетом java.util.concurrent (ThreadPoolExecutor, FutureTask и т. Д.),

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

Обратите внимание, что основное преимущество задач Async над потоками заключается в том, что задачи Async предоставляют вспомогательные методы, такие как onPreExecute() , doInBackground() , onProgressUpdate() и onPostExecute() которые упрощают выполнение коротких фоновых задач, а также взаимодействуют с пользовательским интерфейсом (Например, обновление индикатора выполнения). Эти типы методов недоступны в общих потоках. В основном, задачи Async – это потоки с компонентом взаимодействия с пользовательским интерфейсом. Да, вы можете использовать обходные пути, чтобы попытаться обновить интерфейс пользователя из обычных потоков, но задачи Async были специально созданы для этой цели, и вам не нужно иметь дело с Context Утечки и т. Д., Если вы будете следовать его абстракциям.

Асинхронные задачи создаются для облегчения жизни разработчиков.

Подводить итоги:

  • Асинхронные задачи также являются потоками
  • Асинхронные задачи упрощают взаимодействие с пользовательским интерфейсом при выполнении коротких фоновых задач
  • Ни один из них не является более эффективным. Это зависит от того, что вы хотите сделать.
  • Хорошее эмпирическое правило: используйте Async-задачи, если вам нужно вернуться к / обновить интерфейс после завершения фоновой задачи. Используйте регулярный поток, если вы этого не сделаете.

Наиболее частое использование Thread – это краткосрочные задачи, потому что они нуждаются в большой мощности и имеют тенденцию разряжать аккумулятор и нагревать телефон.
И обычное использование AsyncTasks – это длительные задачи из-за того же AsyncTasks батареи.

Но Thread намного эффективнее, потому что AsyncTasks внутренне использует сам Thread, но вам не нужно его настраивать.

Intereting Posts
Android: создание Looping HorizontalScrollView панорамного изображения с помощью Javascript Выпуск новой версии продукта в Google Play без влияния на бета-версию Android: замените предварительный просмотр камеры изображением Невозможно изменить размер дочерних элементов линейной раскладки в встроенном модуле android SetSelection на счетчике сбрасывается, когда layout_weight назначается счетчику Десятичная запятая или десятичная запятая в Android Где класс SampleZipfileProvider? Firebase UI – Auth – использовать собственный макет Как создать ключевую пару ECDSA (256 бит) для кривой биткойнов (secp256k1) с использованием губчатого замка? Виртуальная память и пейджинг Android Geofencing: Ошибка HTTP-запроса при отправке через фоновый сервис. Дает UnknownHostException Ошибка создания буфера протокола с Android NDK Предотвратите ненужное расширение многострочного TextView до максимальной ширины ИмяNotFoundException webview Говорить с TTS, например, хинди