안드로이드/이론관련

ANR(Application Not Responding)

닉네임못짓는사람 2021. 12. 18. 07:41
반응형

ANR?


ANR은 안드로이드에서 발생하는 오류 중 하나로 Application Not Responding의 약자이다.

이 오류는 Android 앱의 메인 스레드(UI 스레드)가 너무 오랫동안 차단되면 발생한다.

 

주로 오랜 시간을 요구하는 작업의 결과를 UI에 반영하려고 할 때 발생하는데,

네트워크 통신을 수행할 때 시간이 오래 걸리면 ANR오류가 발생할 수 있다.

 

ANR이 발생하는 조건은 다음과 같다.

1. App이 사용자의 Input에 5초 이상 반응하지 않을 때

2. BroadcastReceiver가 10초 이내에 작업을 끝내지 못했을 때

 

위 조건만 봣을 때 단순히 시간이 오래 걸리면 ANR이 발생한다고 생각할 수도 있지만,

이보다는 메인 스레드가 일정 시간 동안 어떤 Task에 잡혀 있으면 ANR이 발생한다고 할 수 있다.

 

이런 ANR을 회피하기 위해선 메인 스레드에서 실행되는 Method는 최소한의 일만 수행하고,

네트워크 통신, 긴 시간을 요구하는 계산같은 작업의 경우 별도의 작업 스레드를

따로 생성하여 처리하는 것을 지향하는 것이 좋다.

 

예제


코드로 예를 들어 보도록 하자.

안드로이드에서 비동기 작업을 수행하기 위해서 Coroutines를 사용할 수 있다.

Coroutines를 사용할 때는 Dispatcher를 정해주어야 하는데, 만약 이를 Main으로 설정하고 delay함수를 실행한다고 해보자.

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        lifecycleScope.launch(Dispatchers.Main) {
            delay(10000)
        }
    }

위와 같이 작성하면 Coroutines블록에서 Main thread를 10초동안 점거해버리기 때문에 ANR이 발생하게 된다.

반응형

'안드로이드 > 이론관련' 카테고리의 다른 글

JAR, DEX, APK, AAR파일  (0) 2021.12.20
View와 ViewGroup  (0) 2021.12.19
View.GONE과 View.INVISIBLE의 차이  (0) 2021.12.08
SharedPreferences (안드로이드)  (0) 2021.10.25
LayoutInflater(안드로이드)  (0) 2021.10.25