안드로이드/안드로이드
Looper와 Handler
snaildeveloper
2025. 6. 6. 07:34
Java 또는 Kotlin에서 코딩을 할 때, 메인 함수에서 실행하며 모든 실행을 마치면 작업이 종료된다.
다른 말로 표현하면 메인 스레드 내의 작업이 완료되면 해당 프로세스는 종료된다는 뜻과 같다.
그러나 안드로이드 앱은 일반적으로 사용자가 스스로 종료하지 않는 이상 앱이 스스로 종료되지 않는다.
즉, 메인 스레드 내의 작업이 종료되지 않고 계속 실행 중임을 알 수 있는데, 그 원인은 메인 스레드 내에서 Looper가 동작 중이기 때문이다.
Looper
Looper는 안드로이드 내에서 UI 스레드인 MainThread 내에서 동작한다. 덕분에 안드로이드는 스스로 종료되지 않고 실행 중인 상태를 유지할 수 있다.
public final class Looper {
public static void loop() {
final Looper me = myLooper();
....
for (;;) {
if (!loopOnce(me, ident, thresholdOverride)) {
return;
}
}
}
}
Looper는 무한 루프를 돌며 스레드를 열어두고, 다른 스레드에서 Handler를 통해 Message를 받아 작업을 처리할 수 있다.
Handler
Handler를 통해 Looper 내에 있는 MessageQueue에 Message를 전달하거나, Looper가 MessageQueue를 통해 전달 받은 작업을 Handler를 통해 수행할 수 있다.
Handler Method
- sendMessage(): Looper 내의 MessageQueue에 Message 전달
- handleMessage(): Looper 내의 MessageQueue의 Message 처리
val handler = Handler(
Looper.getMainLooper(),
object: Handler.Callback{
override fun handleMessage(msg: Message): Boolean {
TODO("Not yet implemented")
}
}
)
val msg = Message.obtain().apply {
obj = "data"
}
handler.sendMessage(msg)