[Android] ANR이란 무엇이고, 어떻게 방지할 수 있는가?
1) ANR(Application Not Responding)이란
Android앱의 UI스레드가너무 오랫동안 차단되면 나타나는 오류 트리거이다.
- 앱이 포그라운드에 있으면 위 사진과 같이 시스템에서 사용자에게 대화상자를 표시한다.
사용자가 ANR 대화상자에서 앱을 강제 종료할 수 있다.
- ANR은 UI업데이트를 담당하는 기본 스레드가 사용자입력 이벤트 또는 화면그리기를처리하지 못하여 사용자의 불만을 초래하므로 문제가 되는것이다.
2) ANR이 발동되는 조건
보통 애플리케이션이 사용자 입력에 응당할 수 없으면 시스템에서 ANR을 표시하게되는데 그조건은 다음과같다.
- 입력 이벤트(예: 키 누름 또는 화면 터치 이벤트)에 5초 내에 응답하지 않음
BroadcastReceiver
가 10초 내에 실행을 완료하지 못함
3) ANR을 방지하는 방법
Android 애플리케이션은 기본적으로 단일 스레드에서 실행된다. 즉, UI스레드에서 시간이 오래걸리는 작업을 할시 ANR이 발생될 수 있다.
- 비동기 처리 방법을 사용하여 메인 스레드를 차단하지 않고 오래 걸리는 작업을 백그라운드에서 실행해야 한다.
- UI 스레드에서 실행되는 메서드는 가능한 한 작업을 적게 실행해야 한다.
- 특히 활동은 가능한 한 적게 실행되어
onCreate()
및onResume()
과 같은 주요 수명 주기 메서드에서 설정해야 한다. - 네트워크나 데이터베이스 작업과 같이 장기 실행 가능성이 있는 작업이나 비트맵 크기 조정과 같이 계산이 많이 필요한 작업은 작업자 스레드에서(또는 데이터베이스 작업의 경우 비동기식 요청을 통해) 실행해야 한다.
- 응답성을 강화하자.
- 애플리케이션이 사용자 입력에 응답하여 백그라운드에서 작업을 실행하는 경우 진행 상황을 보여줍니다(예: UI의
ProgressBar
).
- 애플리케이션이 사용자 입력에 응답하여 백그라운드에서 작업을 실행하는 경우 진행 상황을 보여줍니다(예: UI의