본문 바로가기
옛날

[Android] ANR 이란?

by 차가운게 조아 2016. 1. 29.

What Triggers ANR?


In Android, application responsiveness is monitored by the Activity Manager and Window Manager system services. Android will display the ANR dialog for a particular application when it detects one of the following conditions:


No response to an input event (e.g. key press, screen touch) within 5 seconds

A BroadcastReceiver hasn't finished executing within 10 seconds


ANR 이 발생하는 경우는 어떤 경우일까요?


- Input 이벤트에 5초 안에 응답이 없을 경우(예: key press, screen touch)

- BroadcastReceiver가 10초안에 완료되지 않을 경우.


안드로이드 어플리케이션은 원래 싱글스레드(main)에서만 돌아간다.

이말인 즉슨.. 당신의 어플리케이션이 메인 스레드에서 뭔짓을 하든간에 완료되기까지 오랜 시간이 걸린다면 ANR 다이얼로그가 뜰 수 있다는 것이다.

당신의 어플리케이션에는 그 스스로가 input event나 intent broadcast를 조작할 수 있는 기회가 주어지지 않기 때문이다.


그러므로 메인스레드에서 돌아가는 어떤 메소드라도 가능한한 작은 작업을 해야 한다.

특히나, 액티비티들은 onCreate()와 onResume()과 같은 키 라이프사이클 메소드의 설정은 가능한한 작게 구성되어야 한다.

네트웍이나 데이터베이스 작업 또는 비트맵의 리사이징과 같은 복잡하고 무거운 계산과 같은 시간이 오래 걸리는 명령들은 child thread를 이용해야 한다.(데이터베이스 명령의 경우 asynchronous 요청을 사용한다)

하지만 이것이 메인스레드가 child 스레드가 완료될 때 까지 block 되어야 한다는 뜻은 아니다. child 스레드가 완료될 때 까지 block 시키는 것 보다는 main 스레드에서 child스레드를 위한 Handler를 제공해 주어야 한다.


StrictMode는 네트웍이나 DB 명령들과 같은 잠재적으로 오랜 시간이 걸릴 명령들을 찾는데 도움이 된다.