안드로이드에서 멀티스레딩을 다룰 때 자주 등장하는 세 가지 컴포넌트가 있습니다. 바로 Looper, Handler, HandlerThread입니다. 이들은 스레드를 관리하고, 메시지/작업을 큐에 넣어 순차적으로 처리하며, UI 스레드와의 통신을 가능하게 합니다.
🥯 Looper
Looper는 안드로이드의 스레딩 모델에서 메시지 큐를 모니터링하고 처리하는 핵심 컴포넌트입니다.
스레드를 살아있게 유지하며, 큐에 들어온 메시지나 작업을 순차적으로 꺼내 처리합니다.
주요 역할
- 메시지 큐를 지속적으로 모니터링하고 메시지나 작업을 적절한 핸들러로 전달
- 스레드가 종료되지 않고 계속해서 작업을 기다릴 수 있도록 유지
특징
- 메인(UI) 스레드에는 기본적으로 Looper가 붙어 있음
- 워커 스레드의 경우 Looper.prepare() → Looper.loop()를 통해 직접 초기화 필요
val thread = Thread {
Looper.prepare() // Looper 준비
val handler = Handler(Looper.myLooper()!!) // 현재 스레드의 Looper로 Handler 생성
Looper.loop() // 메시지 루프 시작
}
thread.start()
🥯 Handler
Handler는 Looper와 연결되어 메시지나 Runnable을 큐에 넣고, 해당 스레드에서 실행되도록 도와줍니다.
주요 역할
- 스레드 간 메시지 전달
- 한 스레드에서 다른 스레드로 작업이나 메시지 전달 he(ex. 백그라운드 스레드에서 UI 업데이트 하기)
특징
- 생성 시점의 Looper와 연결됨
- post {} 로 Runnable 실행, sendMessage() 로 메시지 전달 가능
val handler = Handler(Looper.getMainLooper()) // 메인 스레드 Handler 생성
handler.post {
// 메인 스레드(UI)에서 실행
textView.text = "Updated from background thread"
}
🥯 HandlerThread
HandlerThread는 내장된 Looper를 가진 특별한 Thread입니다. 별도의 설정 없이 Looper가 자동으로 붙어 있기 때문에, 메시지 큐 기반의 워커 스레드를 간단히 만들 수 있습니다.
주요 역할
- 전용 백그라운드 스레드를 생성하고 메시지 처리
- Handler와 함께 사용해 순차적인 작업 처리 가능
특징
- start() 호출 시 자동으로 Looper가 준비됨
- Handler(handlerThread.looper) 형태로 Handler 생성 가능
- 종료 시 quit() 또는 quitSafely() 호출 필요
val handlerThread = HandlerThread("WorkerThread")
handlerThread.start() // 스레드 시작
val workerHandler = Handler(handlerThread.looper)
workerHandler.post {
// 백그라운드에서 실행되는 작업
Thread.sleep(1000)
Log.d("HandlerThread", "Task completed")
}
// 종료 (큐에 남은 메시지까지 처리 후 안전하게 종료)
handlerThread.quitSafely()
🥯 차이점
- Looper → 메시지 루프 유지 (스레드를 계속 살아있게 함)
- Handler → 메시지와 Runnable을 큐에 넣고 처리 (스레드 간 통신 담당)
- HandlerThread → 자동으로 Looper가 붙은 워커 스레드 제공
🤷 언제 어떤 걸 쓸까?
- Looper: 메인 스레드 유지 또는 직접 구현한 워커 스레드에서 메시지 루프가 필요할 때
- Handler: 스레드 간 통신, 백그라운드에서 UI 업데이트 등 작업 전달이 필요할 때
- HandlerThread: 네트워크 요청, DB 처리 등 별도의 전용 스레드가 필요한 경우
🥯 마무리
안드로이드의 스레드 관리 구조를 이해하는 것은 효율적인 비동기 처리의 핵심입니다.
Looper는 메시지 루프를 유지하고, Handler는 메시지를 보내고 처리하며, HandlerThread는 이를 쉽게 활용할 수 있는 워커 스레드를 제공합니다.
이 세 가지를 적절히 활용하면 UI는 부드럽게 유지하면서도 무거운 작업을 안정적으로 처리할 수 있습니다.
🔗 참고
- Manifest Interview Android
반응형
'Android' 카테고리의 다른 글
| [Jetpack Compose] Lazy List, 대용량 아이템 리스트 처리하기 (0) | 2026.02.01 |
|---|---|
| [Android] 안드로이드에서 예외(Exceptions) 추적하기 (0) | 2025.09.17 |
| [Android] 런타임 권한(runtime permissions) 처리 (1) | 2025.09.14 |
| [Android] SparseArray에 대하여 (0) | 2025.09.14 |
| [Android] ActivityManager란? (0) | 2025.09.13 |