반응형
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 |