Ответ
Handler позволяет отправлять и обрабатывать сообщения (Message) и Runnable-объекты в потоке, к которому привязан его Looper. Главный поток (UI-поток) уже имеет Looper по умолчанию, созданный в ActivityThread. Поэтому Handler, созданный в главном потоке без явного указания Looper, автоматически использует Looper главного потока.
Пример:
val handler = Handler(Looper.getMainLooper())
handler.post {
// Код выполнится в главном потоке
textView.text = "Updated"
}
Это безопасно, так как Looper.mainLooper гарантированно существует в UI-потоке. Однако, создание Handler в фоновом потоке без своего Looper вызовет исключение.