반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 서브모듈 sourcetree
- 티스토리
- 안드로이드
- 게임개발
- 앱개발
- 목서버
- 안드로이이드 submodule
- Kotlin
- submodule sourcetree
- java
- 쿼터뷰
- github
- 카페오냥
- 유니티
- 서브모듈 pull
- 내 맘대로 정리한 안드로이드
- 안드로이드개발
- 코틀린
- 앱
- 타이쿤
- DataBinding
- github submodule
- Android Studio
- 개발
- 2d게임
- gitlab submodule
- Unity
- firebase
- GIT
- Android
Archives
- Today
- Total
Uing? Uing!!
[내맘대로 정리한 안드로이드] ANR(Application Not Responding)이란? 본문
반응형
ANR이란?
안드로이드 앱을 실행하다 보면 '어플리케이션이 응답하지 않는다'는 팝업 경고 메시지를 마주할 때가 왕왕 있다.
이런 경우의 오류를 ANR(Application Not Responding)이라고 부른다.
ANR은 왜 발생하는가?
ANR에 대한 안드로이드 공식 문서에 따르면, ANR은 다음과 같은 두 상황에 발생한다.
- 활동이 포그라운드에 있는 동안 앱이 입력 이벤트 또는 BroadcastReceiver(예: 키 누름 또는 화면 터치 이벤트)에 5초 이내에 응답하지 않았습니다.
- 포그라운드에 활동이 없을 때 BroadcastReceiver가 상당한 시간 내에 실행을 완료하지 못했습니다.
즉, 앱이 일정 시간 내에 이벤트에 응답하지 못해서 발생한다는 것.
BroadcastReceiver가 이벤트에 응답하지 못하는 이유는?
안드로이드의 스레드 중 입력과 관련된 이벤트는 UI 스레드에서 처리된다.
문제는 안드로이드의 UI 스레드 (==메인 스레드)는 단일 스레드이기 때문에, 한 번에 한 가지의 작업밖에 하지 못한다는 사실이다.
5초 이상 UI스레드에서 다른 작업이 이루어지고 있다면, 터치 등의 이벤트가 생성되더라도 그동안은 응답할 수 없게 된다.
이에 대한 자세한 내용은 아래 포스팅, '왜 UI Thread에서는 긴 작업을 하면 안 되는 걸까?'에 정리해 두었다.
아래는 공식 문서에서 소개된, 구체적으로 ANR이 발생했을 때 진단해볼 수 있는 사례이다.
- 앱이 기본 스레드에서 I/O와 관련된 느린 작업을 실행 중입니다.
- 앱이 기본 스레드에서 긴 계산을 실행 중입니다.
- 기본 스레드에서 다른 프로세스에 관한 동기 바인더 호출을 실행 중이고 다른 프로세스가 반환하는 데 오랜 시간이 걸립니다.
- 다른 스레드에서 발생하는 긴 작업을 위해 동기화된 블록을 대기하는 동안 기본 스레드가 차단되었습니다.
- 기본 스레드가 프로세스에서 또는 바인더 호출을 통해 다른 스레드와 교착 상태에 있습니다. 기본 스레드가 긴 작업이 완료될 때까지 대기하는 것만이 아니라 교착 상태에 있습니다. 자세한 내용은 위키백과에서 교착 상태를 참조하세요.
5가지 모두 공통적으로 '긴 작업에 의해 기본(메인, UI) 스레드가 차단된 상황'에 해당한다.
ANR을 방지하려면?
결론은 단순하다.
메인 UI 스레드가 오래 기다리지 않게 하자.
복잡한 작업이 있다면 백그라운드에서 진행하자.
포스팅 끝.
반응형
'Android' 카테고리의 다른 글
[안드로이드 팁] dp to px 변환하는 방법 (0) | 2020.12.13 |
---|---|
[안드로이드 팁] Resources.getIdentifer(): 변수값을 조합해서 리소스 아이디 받아오기 (0) | 2020.12.11 |
[안드로이드 팁] Java로 디컴파일(Decompile)해서 코드 이해하기 (0) | 2020.11.17 |
[안드로이드 팁] Layout Inspector : 실시간 레이아웃 디버깅하기 (0) | 2020.11.15 |
[안드로이드 삽질기록] No cached version listing for androidx.room:room-common:[2.2.0-rc01] available for offline mode. (0) | 2020.09.30 |
Comments