ANR (Application Not Responding)

지프치프·2023년 5월 12일
0

Android

목록 보기
65/89
post-thumbnail

“Android 로봇은 Google에서 제작하여 공유한 저작물을 복제하거나 수정한 것으로 Creative Commons 3.0 저작자 표시 라이선스의 약관에 따라 사용되었습니다.”


ANR

ANR이란 Application Not Responding의 준 말로
말 그대로 앱이 반응이 없다는 뜻으로 Android 시스템에서 호출하는 오류 Dialog이다.

반응이 없다는 것은 MainThread에서 작업이 오래걸려서 완료하지 못해 UI를 그리지 못해서 앱이 멈춘 것처럼 보인다는 의미이다.

그래서 시스템에선 사용자가 UI 갱신을 한 없이 기다릴 수 없으므로
MainThread에서 작업이 특정 시간 내에 이루어지지 않으면 아래와 같이 ANR을 트리거시킨다.

발생 조건

시스템에서 ANR을 트리거시키는 조건은 아래와 같다.

  • 입력 타임아웃 : 입력 이벤트(클릭 또는 터치)를 5초 이내에 응답하지 못할 경우
  • 서비스 실행 : 앱에서 호출한 서비스가 일정 시간 이내에 onCreate() onStartCommand() onBind()를 완료하지 못할 경우
  • Service.startForeground() 를 호출하지 못 할 경우 : startForegroundService()를 호출하여 Service를 시작했지만 5초 이내에 startForeground()를 호출하지 못할 경우
  • Broadcast 타임아웃 : BroadcastReceiver가 5초 이내에 작업을 완료하지 못한 경우

해결 방법

API level 11 부터 MainThread에서 네트워크나 DB 관련 작업을
실행하려고 하면 Exception이 발생하도록 되어있다.
그리고 소요시간이 긴 작업은 별도의 스레드 처리를 해주는 것도 좋은 방법이다.

  • 네트워크/DB 등의 IO 작업 또는 시간이 오래 걸리는 작업은 별도의 스레드 또는 비동기 처리(Handler, Coroutine 등)를 해준다.
  • MainThread에선 UI 작업만 동작하도록 한다.

이를 한마디로 요약하자면 MainThread에선 UI 작업만 이루어져야하고
그 외의 작업들은 가급적 별도의 스레드에서 이루어져야 한다는 점이다.

그리고 이에 따라 스레드 관리 또한 중요해지기 때문에
Android에선 스레드 어노테이션을 지원한다.
스레드 어노테이션은 다음 기회에 포스팅 해보도록 하겠다.

개인적으로 공부했던 것을 바탕으로 작성하다보니
잘못된 정보가 있을수도 있습니다.
인지하게 되면 추후 수정하겠습니다.
피드백은 언제나 환영합니다.
읽어주셔서 감사합니다.

profile
지프처럼 거침없는 개발을 하고싶은 개발자

0개의 댓글