ANR?

애플리케이션을 개발 하다보면 위 이미지와 같은 ANR 다이얼로그를 종종 볼때가 있습니다. 안드로이드 시스템에서는 일정 시간 사용자와 상호작용이 불가능할 때 애플리케이션의 강제종료를 위해서 ANR 다이얼로그를 호출합니다. 

ANR이 발동되는 경우

  • 5초 이내에 터치 이벤트에 대한 응답이 없을 때
  • 브로드캐스트 리시버의 onReceive()가 10초 내에 리턴되지 않을 때

보통 ANR이 발동되는 경우가 MainThread(UI Thread)에서 너무 많은 작업(네트워크, 파일 읽기/쓰기, 소켓 등)을 할 때 입니다.

화면에 UI를 그리는것은 메인쓰레드만 할 수 있는 작업으로 메인쓰레드에 많은 작업을 부여하면 UI를 그리지 못하고 유져와 상호작용을 하지 못해 ANR이 발생합니다.

ANR 회피하기

시간이 많이 걸리는 작업은 서브 쓰레드에서 동작하도록 하여 메인쓰레드의 부하를 줄이면 됩니다.

  • SubThread에서 시간이 오래걸리는 작업을 수행하고 Handler를 이용하여 작업상태 메시지를 MainThread에 전달합니다.
  • AyncTask를 이용하여 핸들러 사용없이 작업과 작업에 대한 내용을 실시간으로 UI에 업데이트 합니다.
  • RxJava의 스케쥴러를 이용하여 서브쓰레드에서 작업합니다.
카테고리: Tutorial

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.