← 질문 목록
#244깊이 0
안드로이드 메인 스레드에서 무거운 작업을 하면 왜 ANR이 발생하는가?
메인 스레드가 일정 시간 동안 이벤트 루프를 돌지 못해 사용자 입력에 응답하지 않기 때문이다.
| 순서 | 메인 스레드 | 입력 큐 |
|---|---|---|
| 1 | 입력을 처리한다 | 비어 있다 |
| 2 | DB 조회를 시작한다 | 탭 하나가 쌓인다 |
| 3 | 아직 조회 중이다 | 탭 셋이 쌓인다 |
| 4 | 아직 조회 중이다 | 시스템이 ANR 창을 띄운다 |
안드로이드는 UI 갱신과 사용자 입력 처리를 메인 스레드 하나에서 전담한다. 여기서 네트워크 요청이나 DB 조회 같은 무거운 작업이 수행되면 큐에 쌓인 다음 이벤트들을 처리하지 못한다.
입력을 5초쯤 처리하지 못하면 ANR로 본다. 브로드캐스트나 서비스는 기준 시간이 따로 있다. 이때 메인 스레드는 여전히 작업 중이지만, 더 이상 사용자 인터랙션이 불가능한 상태가 된다.
결국 ANR을 막으려면 메인 스레드에서는 UI 갱신만 수행하고, 시간이 오래 걸리는 작업은 Worker 스레드나 Coroutine으로 분리해야 한다.