Android ANR(Application Not Responding) 완벽 정리
✨ 개요
ANR (Application Not Responding)
- 앱이 일정 시간 동안 사용자 입력에 반응하지 않으면 시스템이 사용자에게 표시하는 경고
- 사용자가 앱이 멈췄다고 느끼는 대표적인 케이스로, UX에 치명적입니다.
1. 🧨 ANR 발생 조건
- 메인 스레드가 5초 이상 블로킹될 경우 발생
- 대표적인 상황:
- 무한 루프 또는 장시간 실행되는 작업
- 네트워크 요청을 메인 스레드에서 수행
- ContentProvider, BroadcastReceiver 타임아웃 초과
2. 📦 ANR 발생 유형
유형 | 제한 시간 | 설명 |
---|---|---|
Input Dispatch Timeout | 5초 | 터치, 키보드 등 입력 이벤트가 5초 이내 처리되지 않음 |
Broadcast Timeout | 10초 (foreground) / 60초 (background) | BroadcastReceiver가 지정된 시간 내 완료되지 않음 |
ContentProvider Timeout | 10초 | ContentProvider 쿼리가 시간 내 끝나지 않음 |
3. 🛠️ ANR 방지 방법
- 무거운 작업은 반드시 백그라운드 스레드에서 처리 (e.g., Coroutine, AsyncTask, Executor 등)
- 네트워크 요청은 OkHttp, Retrofit 등 비동기 방식 사용
- BroadcastReceiver 최소한의 로직만 처리
-
프로파일러/StrictMode/ANR 로그 분석으로 병목 지점 확인
4.🧠 결론
- ANR은 사용자 경험을 심각하게 저해하는 요소로, 모든 Android 개발자가 반드시 피해야 할 항목입니다.
- 핵심은 메인 스레드를 깨끗하게 유지하는 것.
- 장시간 작업 = 별도의 스레드, 입력 이벤트 = 즉시 반응을 원칙으로 설계해야 합니다.