ANR?
애플리케이션을 개발 하다보면 위 이미지와 같은 ANR 다이얼로그를 종종 볼때가 있습니다. 안드로이드 시스템에서는 일정 시간 사용자와 상호작용이 불가능할 때 애플리케이션의 강제종료를 위해서 ANR 다이얼로그를 호출합니다.
ANR이 발동되는 경우
- 5초 이내에 터치 이벤트에 대한 응답이 없을 때
- 브로드캐스트 리시버의 onReceive()가 10초 내에 리턴되지 않을 때
보통 ANR이 발동되는 경우가 MainThread(UI Thread)에서 너무 많은 작업(네트워크, 파일 읽기/쓰기, 소켓 등)을 할 때 입니다.
화면에 UI를 그리는것은 메인쓰레드만 할 수 있는 작업으로 메인쓰레드에 많은 작업을 부여하면 UI를 그리지 못하고 유져와 상호작용을 하지 못해 ANR이 발생합니다.
ANR 회피하기
시간이 많이 걸리는 작업은 서브 쓰레드에서 동작하도록 하여 메인쓰레드의 부하를 줄이면 됩니다.
- SubThread에서 시간이 오래걸리는 작업을 수행하고 Handler를 이용하여 작업상태 메시지를 MainThread에 전달합니다.
- AyncTask를 이용하여 핸들러 사용없이 작업과 작업에 대한 내용을 실시간으로 UI에 업데이트 합니다.
- RxJava의 스케쥴러를 이용하여 서브쓰레드에서 작업합니다.
0개의 댓글