ANR 제대로 알아보자

1

최근에 면접을 봤던 일이다.

"비동기 통신을 함으로써 ANR을 막을수 있다."
"그럼 ANR이 언제 발생하는지 알려주실수 있나요??"
"...네?"


다행이 회사는 붙었지만.. 그때의 상황은 아직도 충격..

ANR이 뭐니?


ANR은 Application Not Responding 의 약자이다.
메인쓰레드의 UI가 멈춘채 진행을 하고 있지않다는 의미인데 출현 조건은 다음과 같다.

출현 조건

  • Input 이벤트(키를 누르거나 화면을 터치하는 행위)에 5초동안 반응이 없을때
  • BroadcatReceiver 가 10초내로 실행을 끝내지 않을 때 (UI가 없는 브로드캐스트 리시버, 서비스도 실행 주체가 메인스레드이므로 긴 시간을 소모하는 작업인 경우 ANR을 발생시킨다.)

결국 그놈의 메인쓰레드가 어딘가에 묶여서 느리게 동작하는거다.

왜 이딴게 생겨놨을까...?

우리가 개발할때마다 심심할때 뜨는 ANR은 앱을 상향평준화 하려는 구글의 노력구글의계략이다.

개발자가 아닌 UX적인관점에서 보자.

인내심의 한계의 시간은 ‘3초’

구글 리서치 자료에 따르면 모바일 웹 사이트의 로딩 시간이 3초 이상일 때 32%, 5초 이상은 90%, 6초 이상은 106% 마지막으로 10초가 넘으면 123%의 이탈률이 발생한다고 합니다.
긴 로딩으로 인한 사용자 이탈막기 – UX 디자이너를 위한 팁 3가지

앱에서 3초만 응답이 없어도 90%가 빠져나간다니.. 후덜덜하지 않는가?
방금 그 멈춤 하나때문에 당신의 앱은 10%사용자만 남은것이다.

예방하기 위한 우리의 노력


ANR을 예방하기 위해서는 어떻게 해야할까?

  • 결과가 길어지는 작업은 비동기로 처리한다.
    응답이 느려질 가능성이 있다면,코루틴을 사용하든 쓰레드를 사용하든
    메인쓰레드에서는 UI수정만을 처리하자.
    잠깐이라도 UI가 버벅되면 사용자가 빠져나갈지니..
  • broadcast로 무거운작업을 돌릴경우, Service로 옮긴다.
    broadcast나 service또한 메인쓰레드에서 동작하지만,
    서비스가 ANR에 좀더 널널한 편이다.

메인 쓰레드에서 무거운 작업을 하지 말고 대신 IntentService, AsyncTask, Handler, 다른 쓰레드와 같은 워커 쓰레드를 사용하도록 노력해보자.

그렇다면 ANR이 나오는 일을 없지 않을까...?

profile
쉽게 가르칠수 있도록 노력하자

1개의 댓글

comment-user-thumbnail
2022년 2월 24일

짤이 적절하고 너무 웃기네요!

답글 달기