Основной поток (Main Thread) или UI поток в Android отвечает за отрисовку пользовательского интерфейса, обработку событий ввода и выполнение большинства компонентов приложения (Activity, Service, Broadcast Receiver).
Его работа основана на механизме Looper и Handler.
- Looper: Это класс, который циклически извлекает сообщения (Message) из очереди сообщений (MessageQueue) и передает их для обработки соответствующему Handler'у. Каждый поток, имеющий Looper, является "петлевым". Основной поток создается с Looper автоматически.
- MessageQueue: Это структура данных, хранящая список сообщений, которые должны быть обработаны. Сообщения могут содержать данные (объекты, примитивы) и ссылку на Handler, который должен их обработать.
- Handler: Это класс, связанный с Looper'ом и MessageQueue потока. Он позволяет отправлять сообщения в MessageQueue и обрабатывать сообщения, извлеченные Looper'ом. Handler может отправлять сообщения как в свой собственный поток (например, планируя задачи), так и в другие потоки с Looper'ом.
Принцип работы:
- Looper основного потока запускается и непрерывно обрабатывает цикл
loop().
- Система или другие потоки отправляют сообщения (например, события касания, сообщения о жизненном цикле Activity) в MessageQueue основного потока через Handler'ы.
- Looper извлекает следующее сообщение из MessageQueue.
- Looper передает сообщение Handler'у, связанному с этим сообщением.
- Handler обрабатывает сообщение, выполняя соответствующую логику (например, обновление UI).
Важно: Все операции, связанные с обновлением UI, должны выполняться только в основном потоке. Выполнение длительных операций (сетевые запросы, работа с файлами) в основном потоке приведет к его блокировке (ANR - Application Not Responding) и зависанию приложения. Для таких операций следует использовать рабочие потоки (например, с помощью Coroutines, RxJava, ExecutorService, AsyncTask).