스터디
[Manifest-Android] 24. Looper, Handler, HandlerThread
참깨빵위에참깨빵_
2025. 7. 9. 13:39
728x90
반응형
쓰레드를 관리하고 비동기 통신 처리를 위해 함께 작동하는 컴포넌트다. 백그라운드 쓰레드에서 작업을 수행하면서 UI 업데이트를 위해 메인 쓰레드와 상호작용하기 위한 필수 컴포넌트다.
Looper
쓰레드를 살아있게 유지해서 메시지 or 작업 큐를 순차 처리하는 안드로이드 쓰레딩 모델의 일부. 메인 쓰레드, 다른 워커 쓰레드에서 핵심 역할을 한다.
메시지 큐를 지속 모니터링하고 메시지나 작업을 적절한 핸들러에 가져와 디스패치하기 위해 사용한다. 메인 쓰레드엔 기본으로 루퍼가 있지만 워커 쓰레드는 명시적으로 준비해야 한다.
Looper.prepare()로 쓰레드에 루퍼를 연결하고 Looper.loop()를 써서 루프를 시작한다.
val thread = Thread {
Looper.prepare() // 스레드에 Looper 연결
val handler = Handler(Looper.myLooper()!!) // Looper를 사용하여 Handler 생성
Looper.loop() // 메시지 루프 시작
}
thread.start()
Handler
쓰레드의 메시지 큐 안에서 메시지, 작업을 보내고 처리할 때 쓰며 루퍼와 같이 작동한다.
한 쓰레드에서 다른 쓰레드로 작업, 메시지를 전달하고 핸들러가 생성될 때 만들어진 쓰레드의 루퍼에 연결된다. 핸들러로 전송된 작업은 연결된 쓰레드에서 처리된다.
val handler = Handler(Looper.getMainLooper()) // 메인 스레드에서 실행됨
handler.post {
// UI 업데이트 코드
textView.text = "Updated from background thread"
}
HandlerThread
내장된 루퍼를 가진 특수 쓰레드. 작업, 메시지 큐를 처리할 수 있는 백그라운드 쓰레드를 만드는 과정을 단순화한다.
자체 루퍼를 가진 워커 쓰레드를 만들고 이 쓰레드에서 작업을 순차 처리할 수 있게 하며 start()로 HandlerThread를 시작하고 getLooper()로 루퍼를 얻는다. 리소스를 해제하려면 항상 quit() 또는 quitSafely()를 써서 루퍼를 종료해야 한다.
val handlerThread = HandlerThread("WorkerThread")
handlerThread.start() // 스레드 시작
val workerHandler = Handler(handlerThread.looper) // 해당 Looper를 사용하여 작업 처리
workerHandler.post {
// 백그라운드 작업 수행
Thread.sleep(1000)
Log.d("HandlerThread", "Task completed")
}
// 스레드 종료
handlerThread.quitSafely() // 처리 중인 메시지 완료 후 안전하게 종료
반응형