ANR
Activity Not Response의 약어로 액티비티에서 발생하는 에러 상황을 뜻한다. ANR을 고려하지 않고 앱을 만들면 애플리케이션이 에러에 의해서 수시로 종료될 가능성이 있다. 이 ANR은 유저 이벤트에 액티비티가 5초 이내에 반응하지 못하는 경우 발생하며, 앱이 포그라운드에 있으면 아래와 같이 시스템에서 사용자에게 다이얼로그를 표시한다.

ANR이 일어나는 상황
유저가 이벤트를 주었을 때, 이벤트는 메시지 큐에 담기게 되고 시스템 내부에서는 메시지 큐에서 이벤트를 추출하여 해당 업무를 수행한다. 이때, 유저 이벤트에 의해서 이벤트가 큐에 담기는 순간부터 5초 이내에 이 이벤트가 처리되지 않으면 시스템에서 강제적으로 해당 액티비티를 종료시키게 된다. → ANR이 발생
메시지 큐(MessageQueue): 메시지를 담는 자료구조
ANR 상황의 예시
1. 액티비티가 응답하지 못하는 상황이 발생하면 시스템 상에서 강제로 종료시킨다.
- 데스크톱과 달리 애플리케이션은 유저 입장에서 특정 애플리케이션의 프로세스를 강제로 종료하는 처리가 불가능하기 때문에 시스템에서 강제로 종료한다.
2. 액티비티가 현재 시간이 오래 걸리는 업무 로직을 처리하고 있는 경우에 유저 이벤트를 발생시키게 되면 시스템 상에서 액티비티를 강제로 종료시킨다.
- 모든 액티비티는 시스템에서 실행시킨 하나의 스레드(메인 스레드)에 의해서만 수행되기 때문에 업무로직을 동시에 처리할 수 없다. 이에 현재 업무 로직이 끝나기 전에는 다른 이벤트가 처리될 수 없으므로 시스템에서 프로세스를 강제로 종료한다.
- 앱 내에 시간이 오래 걸리는 업무가 존재한다면 ANR 문제를 고려하여 개발을 해야 한다. 시간이 오래 걸리는 업무 중 하나는 네트워킹인데 모바일은 네트워크 불능 상태가 일어날 가능성이 높기 때문에 네트워킹을 할 때는 항상 ANR 문제를 고려해 주어야 한다.

메인스레드: 시스템에서 액티비티를 실행시키는 수행 흐름
ANR 해결 방법
ANR은 비동기적 처리로 해결할 수 있으며 구현 방식은 아래 3가지가 존재한다. Thread-Handler와 AsyncTask는 현재 공식 deprecation 된 상태이므로 Coroutine을 사용하는 방식을 더 권장한다.
• Thread-Handler로 해결
• AsyncTask로 해결
• Coroutine으로 해결