Когда мне нужно что-то для асинхронного запуска , например, длительная задача или логика, использующая сеть, или по любой другой причине, запуск нового потока и его выполнение работает нормально. Создание и запуск обработчика тоже работает. Какая разница? Когда я должен использовать каждый из них? Каковы преимущества / причины использования a, Handler
а не a Thread
?
PS. - Ради этого вопроса давайте проигнорируем AsyncTask
. - Handler().postDelayed
вариант использования мне понятен, поэтому давайте предположим, что мне нужно, чтобы задача запускалась немедленно.
Ответы:
Если все, что вы делаете, «тяжело», вы должны делать это в потоке. Если вы явно не запускаете его в собственном потоке, он будет работать в основном (UI) потоке, который может быть заметен пользователями как нестабильный или медленный интерфейс.
Интересно, что, когда вы используете поток, часто полезно также использовать обработчик как средство связи между рабочим потоком, который вы запускаете, и основным потоком.
Типичное взаимодействие потока / обработчика может выглядеть примерно так:
В целом, можно сделать вывод, что вы должны использовать поток каждый раз, когда выполняете какую-либо работу, которая может быть длительной или очень интенсивной (например, что-либо сетевое, файловый ввод-вывод, тяжелая арифметика и т. Д.).
источник
updateUI()
запустится послеonCreateView
(после загрузки новых представлений)?message.what()
? Разве это не было бы простоif(msg == 0){
? Спасибо! :)Обработчик и поток - это две разные вещи.
Для выполнения длительных заданий необходимо создать поток.
Обработчик - очень удобный объект для связи между двумя потоками (например: фоновый поток должен обновлять пользовательский интерфейс. Вы можете использовать обработчик для публикации некоторого Runnable из фонового потока в поток пользовательского интерфейса).
Таким образом, у вас нет выбора между обработчиком или потоком. Используйте нить для тяжелой работы! (вы можете использовать обработчик, если ваш фоновый поток инициирует выполнение некоторой работы в другом потоке - большую часть времени поток пользовательского интерфейса)
источник
Handler
иThread
это две разные вещи, но они не противоречат друг другу. У вас могут быть aHandler
и aThread
одновременно, и фактически каждый из нихHandler
должен работать в aThread
.Для получения дополнительных сведений ознакомьтесь с этой статьей .
источник
A
Handler
работает в одном потокеThread
, aThread
выполняется в другом потоке.Используйте обработчик, если вам нужно запустить что-то в том же потоке , обычно это элемент графического интерфейса или что-то в этом роде.
Используйте поток, если вы хотите, чтобы основной поток мог заниматься другими делами . Используйте это для всего, что требует много времени.
источник
Обработчики - лучший способ связи между фоном и потоком пользовательского интерфейса. Обычно обработчики связаны с очередью сообщений потока, и они используются для отправки сообщений и запускаются в сообщении.
ОБЛАСТЬ ПРИМЕНЕНИЯ:
Тема: для выполнения задач в более безопасном (фоновом) потоке, чем поток пользовательского интерфейса. (помогает разблокировать поток пользовательского интерфейса)
Обработчик Используется для связи между пользовательским интерфейсом и фоновым потоком.
Взгляните на эту статью
источник
... подробнее здесь о потоках и т. д. (включая туториалы для различных механизмов потоковой передачи и синхронизации, а также когда что использовать)
источник
Handler позволяет передавать и обрабатывать сообщения и
Runnable
объекты , связанные с потокаMessageQueue
. каждыйHandler
экземпляр связан с одним потоком и очередью сообщений этого потока.Когда вы создаете новый
Handler
, он привязывается к потоку / очереди сообщений потока, который его создает - с этого момента он будет доставлять сообщения и исполняемые файлы в эту очередь сообщений и выполнять их, когда они выходят из очереди сообщений. ,Есть два основных применения обработчика:
Если вы используете потоки Java, вам придется кое-что решать самостоятельно - синхронизацию с основным потоком, отмена потока и т. Д.
Этот единственный поток не создает пул потоков, если вы не используете API
ThreadPoolExecutor
илиExecutorService
.(Этот запрос взят из ваших комментариев к ответу Blackbelt)
Ссылка: статья о производительности потоков
Есть определенные виды работы, которые можно свести к высоко параллельным распределенным задачам. С большим объемом работы пакетов это создает,
AsyncTask
аHandlerThread
не соответствующие классы. Однопоточная природаAsyncTask
превратит всю работу с пулом потоков в линейную систему. СHandlerThread
другой стороны, использование класса потребует от программиста ручного управления балансировкой нагрузки между группой потоков.ThreadPoolExecutor - это вспомогательный класс, упрощающий этот процесс. Этот класс управляет созданием группы потоков, устанавливает их приоритеты и управляет распределением работы между этими потоками. По мере увеличения или уменьшения рабочей нагрузки класс раскручивает или уничтожает больше потоков, чтобы приспособиться к рабочей нагрузке.
Вы можете обратиться к этой статье руководства разработчика о create-threadpool для получения дополнительных сведений.
Взгляните на этот пост для использования
Handler
для запуска нескольких экземпляров Runnable. В этом случае всеRunnable
задачи будут выполняться в одном потоке.Android: тост в ветке
источник
Handler
может использоваться вместе сThread
для создания механизма очереди. Uвы можете использовать,handler
чтобы опубликовать что-нибудь вThread
Looper
источник