Разница между AsyncTask и Thread/Runnable
У меня есть вопрос, который озадачивает меня.
Представьте, что я хочу сделать что-то в другом потоке, например, получить материал GPS/Location, который, как рекомендуется в документах SDK, должен использовать фоновый поток.
Итак, вот вопрос: в чем разница между
Создание
Thread
в фоновом режиме черезAsyncTask
А ТАКЖЕСоздание
Thread thread1 = new Thread(new Runnable()
... и реализацииrun()
?
4 ответа
AsyncTask - это удобный класс для выполнения некоторой работы над новым потоком и использования результатов в потоке, из которого он был вызван (обычно поток пользовательского интерфейса), когда закончите. Это просто оболочка, которая использует несколько исполняемых файлов, но обрабатывает все тонкости создания потока и обработки сообщений между потоками.
AsyncTask позволяет правильно и легко использовать поток пользовательского интерфейса. Этот класс позволяет выполнять фоновые операции и публиковать результаты в потоке пользовательского интерфейса без необходимости манипулировать потоками и / или обработчиками.
AsyncTask разработан как вспомогательный класс для Thread и Handler и не представляет собой универсальную среду потоков. AsyncTasks в идеале следует использовать для коротких операций (самое большее несколько секунд). Если вам нужно, чтобы потоки работали в течение длительного времени, настоятельно рекомендуется использовать различные API, предоставляемые пакетом java.util.concurrent, такие как Executor, ThreadPoolExecutor и FutureTask.
Асинхронная задача определяется вычислением, которое выполняется в фоновом потоке и результаты которого публикуются в потоке пользовательского интерфейса. Асинхронная задача определяется 3 общими типами, называемыми Params, Progress и Result, и 4 шагами, называемыми onPreExecute, doInBackground, onProgressUpdate и onPostExecute.
Интерфейс Runnable лежит в основе многопоточности Java. Интерфейс Runnable должен быть реализован любым классом, экземпляры которого предназначены для выполнения потоком.
Также, если я цитирую из этого блога:
если вам нужно ПРОСТОЕ кодирование, используйте AsyncTask, а если вам нужна СКОРОСТЬ, используйте традиционный поток Java.
Также учтите, что начиная с Android v4.04, вы не можете иметь более одного AsyncTasks
за раз, если вы не потеряете совместимость с более низкими версиями. Будь в курсе!
Ключевые отличия:
AsyncTask - это асинхронная задача, определяемая вычислением, которое выполняется в фоновом потоке и результаты которого публикуются в потоке пользовательского интерфейса. Это не может быть сделано с нормальным потоком, если вы не используете
Handler
в потоке пользовательского интерфейса и опубликовать сообщение ИЛИ напрямую изменить атрибут объекта путем реализации правильной синхронизации.В соответствии с рекомендациями руководства по производительности потоков,
Необходимо учитывать несколько важных аспектов производительности. Во-первых, по умолчанию приложение помещает все объекты AsyncTask, которые оно создает, в один поток. Поэтому они выполняются последовательно, и, как и в случае основного потока, особенно длинный рабочий пакет может блокировать очередь. По этой причине мы рекомендуем использовать AsyncTask только для обработки рабочих элементов длительностью менее 5 мс.,
Но обычный поток можно использовать для длительных задач.
Простые потоки Java не очень полезны для Android в отличие от HandlerThread, который был предоставлен платформой Android.
Удобный класс для запуска нового потока, который имеет петлитель. Цикл затем может быть использован для создания классов обработчиков. Обратите внимание, что start() все еще должен быть вызван.
Обратитесь к сообщению ниже, чтобы узнать больше деталей:
AsyncTask устарел с уровнем API 30. Использование thread/runnable удобно
Лучше использовать новый планировщик заданий в библиотеке поддержки.
Один очевидный недостаток класса AsyncTask заключается в том, что после Android 3.0 асинхронные задачи выполняются в соответствии с последовательностью времени запуска. то есть задачи выполняются одна за другой, если только вы не выполняете задачу, вызывая executeOnExecutor(Executors.newCachedThreadPool()). этот метод создаст ваш собственный пул потоков.