Приложения в Android запускаются в виртуальной машине, использующей Java Runtime. В Java вся работа выполняется в потоках. Поток заканчивает работу, когда отрабатывает метод
run(). В Android главный (UI) поток не всегда занят выполнением какой-либо задачи и часто находится в ожидании действий пользователя или событий системы. Для реализации такого поведения в Android используются три сущности, которые работают вместе:
Looper,
MessageQueue и
Handler.
Looper запускает цикл обработки сообщений, связанный с потоком. Поток работает, пока связанный с ним лупер не будет остановлен.
Для создания лупера, вызывается статический метод
Looper.prepare(). Созданный лупер будет связан с потоком, в котором вызван этот метод.
Для старта лупера используется статический метод
Looper.loop(). Между вызовами методов
prepare() и
loop() обычно создается
Handler, который будет обрабатывать сообщения, приходящие в
MessageQueue лупера.
Для остановки лупера используется метод
quit() или
quitSafely(). Разница между этими методами в том, что
quit() останавливает лупер незамедлительно, а
quitSafely() завершает обработку сообщений, которые уже добавлены в очередь.
Эти методы не статические и вызываются на инстансе класса
Looper. Получить лупер текущего потока можно статическим методом
Looper.myLooper(). Лупер UI потока можно получить методом
Looper.getMainLooper().