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


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

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

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

  1. создание Thread в фоновом режиме через AsyncTaskи

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

4 53

4 ответа:

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

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

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

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

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

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

Если вам нужно простое кодирование, используйте AsyncTask, и если вам нужна скорость, используйте традиционный поток java.

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

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

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

  2. как рекомендовано руководством разработчика относительно нить производительность,

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

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

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

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

см. ниже Сообщение, чтобы узнать больше подробности:

Handler vs AsyncTask vs Thread

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