Подтвердить что ты не робот

Разница между AsyncTask и Thread/Runnable

У меня вопрос, который меня озадачивает.

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

Итак, вот вопрос: какая разница между

  • Создание Thread в фоновом режиме с помощью AsyncTask И

  • Создание Thread thread1 = new Thread(new Runnable()... и реализация run()?

4b9b3361

Ответ 1

AsyncTask - это класс удобства для выполнения некоторой работы над новым потоком и использования результатов в потоке, из которого он вызван ( как правило, поток пользовательского интерфейса). Это просто оболочка, которая использует пару runnables, но обрабатывает все тонкости создания потока и обработки сообщений между потоками.

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

AsyncTask предназначен для вспомогательного класса вокруг Thread и Handler и не является общей структурой потоков. AsyncTasks в идеале следует использовать для коротких операций (не более нескольких секунд). Если вам нужно поддерживать длительность потоков в течение длительных периодов времени, настоятельно рекомендуется использовать различные API, предоставляемые java.util.concurrent pacakge, такие как Исполнитель, ThreadPoolExecutor и FutureTask.

Асинхронная задача определяется вычислением, которое выполняется на фоновом потоке и результат которого публикуется в потоке пользовательского интерфейса. Асинхронная задача определяется тремя универсальными типами, называемыми Params, Progress и Result, и 4 шагами, называемыми onPreExecute, doInBackground, onProgressUpdate и onPostExecute.

Интерфейс Runnable лежит в основе потоковой передачи Java. Интерфейс Runnable должен быть реализован любым классом, экземпляры которого предназначены для выполнения потоком.

Также, если я цитирую этот блог:

если вам нужно SIMPLE кодирование, используйте AsyncTask, и если вам требуется SPEED, используйте традиционный Java-поток.

Ответ 2

Также считайте, что, начиная с Android v4.04, вы не можете одновременно иметь более одного AsyncTasks, если не потеряете совместимость с более низкими версиями. Помните!

Ответ 3

Основные отличия:

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

  • Как рекомендовано руководством разработчика относительно Эффективность потока,

    Есть несколько важных аспектов производительности, которые следует учитывать. Во-первых, по умолчанию приложение выталкивает все объекты AsyncTask, которые он создает, в один поток. Поэтому они выполняются серийно, и, как и основной поток, особенно длинный рабочий пакет может блокировать очередь. По этой причине мы рекомендуем использовать AsyncTask для обработки рабочих элементов длиной менее 5 мс..

    Но нормальный Thread может использоваться для длительных задач.

Plain java Threads не очень полезны для Android, в отличие от HandlerThread, который был предоставлен платформой Android.

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

Обратитесь к нижеприведенному сообщению, чтобы узнать подробности:

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

Ответ 4

Лучше использовать новый планировщик заданий в библиотеке поддержки.

Ответ 5

Одним из очевидных недостатков для класса AsyncTask является то, что после того, как асинтеты Android 3.0 выполняются в соответствии с последовательностью времени начала. то есть задачи выполняются один за другим, если только вы не выполняете задачу, вызвав "executeOnExecutor (Executors.newCachedThreadPool())". этот метод создаст ваш собственный пул потоков.