안드로이드 개발자라면 누구나 한번 씩 들어봤을 것이다.
바로 ANR(Application Not Responding) 이다.
나도 물론 수없이 접해왔고 들어왔다.
요즘 같이 Coroutine이 나온 시점부터는 ANR을 많이 접해보진 못했지만,
그래도 앱 안정성에 있어서 1순위로 조심해야 될 오류이다.
공식문서에 따르면
Android 앱의 UI 스레드가 너무 오랫동안 차단되면 'ANR(애플리케이션 응답 없음)' 오류가 트리거됩니다
라고 친절하게 나와있다. 그래서 우리는 모두 UI 스레드를 조심해야 된다고 배웠을 것이다.
물론 나도 얼마전까진 그렇게 생각했었다..
얼마전에 나는 질문을 받았었다.
ANR을 아시나요?
넵!! Application Not Responding 의 약자입니다.
언제 발생하는지도 아시나요?
넵!! UI스레드를 5초이상 막을 때 발생합니다.
그럼 IO스레드를 막으면 발생안하나요?
흠....난 머릿속으로 엄청 고민했었다. 이걸 물어보는 의도가 무엇일까..
머릿속으로는 당연히 IO스레드와는 관련이 없지 않나? 근데 물어보는 이유가 있을 것 같지만 아니요라고 해도 어차피 그에 합당한 이유를 말했어야 됐을 것이다. 그래서 나는 그 짧은 순간에 그냥 솔직히 내 생각대로 말하자! 라고 결심을 하고 당당히 네!! 라고 말해버렸다.
근데 질문한 사람이 어이가 없다듯이 피식 웃어버렸다..
속으론 나는 망했다. 쪽팔린다. 아닌가보다!라고 생각했다 그리고 나서
얼른 나의 정신적 지주인 Gemini에게 조심스럽게 여쭤보았다.
예..? 뭐지,, 내가 틀린게 아닌가라고 생각했다. 그리고 나서는 질문의 의도를 생각해보았다. 몇차례 고민한 결과,,
내가 생각한 그사람의 의도는 교착상태에 대해 물어본 것 같다. 물론 runBlocking을 사용해야 가능한 일이긴 하다.
runBlocking(Dispatchers.Main) {
withContext(Dispatchers.IO) {
// 5초이상 걸리는엄청 무거운 작업
}
}
이 경우에는 ANR이 발생한다. 물론 개발을 하면서 runBlocking을 쓰는 경우는 거의 없기 때문에 IO스레드를 막아도 발생한 일은 거의 없지만, 그래도 질문에 의도가 이거였다면 내가 당당하게 틀렸던 것 같았다.
그사람의 의도는 당사자만 알겠지만.. 혹시 알 것 같은 사람은 댓글 부탁드립니다..!
끝