안드로이드 앱의 UI 스레드가 너무 오래 차단되면 ANR 오류가 발생한다.
안드로이드의 Main스레드는 UI를 담당하는 스레드로 해당 스레드가 차단되면 UI업데이트를 처리하지 못해 사용자의 불만을 초래할 수 있다. 그렇기에 Main스레드를 일정시간 이상 점거할 경우 ANR이 발생하게 된다.
다음 조건중 하나가 발생할 경우 ANR이 트리거 된다.
입력 이벤트에 5초이상 응답하지 않은 경우
어딘가에서 메인 스레드를 점유하고 있다면 사용자가 버튼클릭 등의 이벤트를 입력하여도 전달되지 못한다. 일정시간 이벤트가 전달되지 못한다면 ANR을 발생시킨다.
앱에서 선언한 서비스가 몇초이내에 실행을 완료할 수 없는 경우
서비스에서 20초 이상 작업하게 되는 경우 ANR을 발생시킨다. 서비스또한 메인스레드 위에서 동작하기 때문에 장시간 스레드를 점유할 수 없다. 실제로 스탑워치 기능을 서비스를 통해 구현하다 ANR을 마주하게 되었고 이 글을 쓰게 되었다.
Context.startForegroundService()를 사용하여 포그라운드에서 새 서비스를 시작했지만 서비스가 5초 내에 startForeground()를 호출하지 않은 경우
BroadcastReceiver가 설정된 시간 내에 실행을 완료하지 못한 경우.
앱에 포그라운드 활동이 있는 경우 이 제한 시간은 5초이다.
메인 스레드의 사용을 주의하며 장시간 점유하지 않도록 해야한다. 오래걸리는 작업의 경우 별도의 스레드를 사용하여 ANR이 발생하지 않을 수 있도록 한다.