Ответ
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 вызовет исключение.
Ответ 18+ 🔞
А, слушай, вот Handler — это такая штука, которая позволяет тебе кидать сообщения и задачи в поток, к которому привязан его Looper. Представь себе почтальона, но не простого, а такого, который работает только на одном конкретном этаже небоскрёба. Это Looper.
Так вот, главный поток, он же UI-поток, у него этот самый Looper уже есть по умолчанию, создаётся он где-то в недрах ActivityThread. Поэтому если ты создашь Handler прямо в главном потоке и не будешь указывать Looper явно — он автоматом прицепится к главному. Всё просто, как три копейки.
Вот смотри, пример кода, тут нихуя не трогаем:
val handler = Handler(Looper.getMainLooper())
handler.post {
// Код выполнится в главном потоке
textView.text = "Updated"
}
Видишь? Берём Looper.getMainLooper() — это гарантированно даст нам тот самый, главный, готовый к работе Looper. И когда мы через handler.post шлём лямбду, она выполнится именно в UI-потоке. Безопасно, надёжно, можно спать спокойно. Пизда рулю, а не подход.
Но вот тут, ёпта, есть один важный момент, про который многие забывают, а потом охуевают. Если ты попробуешь создать Handler в каком-нибудь фоновом потоке, который ты сам запустил, и не создашь для него свой собственный Looper — будет тебе RuntimeException с криком "Can't create handler inside thread that has not called Looper.prepare()". Представляешь? Ты такой весь в коде, а тут — ядрёна вошь! — и всё накрылось медным тазом.
Короче, запомни: в главном потоке — можно расслабиться, там всё готово. В своём потоке — либо готовь Looper сам, либо не лезь, куда не просят. Вот и вся философия, блядь.