액티비티가 응답하지 않는 오류 상황을 의미한다.
액티비티가 사용자 이벤트에 5초 이내에 반응하지 않으면 ANR 오류가 발생한다.
시스템의 수행 흐름에서 시간이 오래 걸리는 작업이 끝나지 않으면 사용자 이벤트에 반응하지 못한다.
[사진 출처]
https://onlyfor-me-blog.tistory.com/392
액티비티를 실행한 메인 스레드 이외의 개발자 스레드를 만들어 시간이 오래 걸리는 작업을 담당하게 한다.
ANR 오류는 해결되지만 화면을 변경할 수 없다는 문제가 발생한다.
화면 변경은 메인 스레드에서만 할 수 있기 때문이다.
코루틴으로도 ANR 오류를 해결 할 수 있다.
비동기 경량 스레드라고 요약할 수 있다.
안드로이드 시스템이 아니라 프로그래밍 언어에서 제공하며, 코틀린에서도 공식으로 지원한다.
아래의 장점이 있다.
- 경량
- 적은 메모리 누수
- 취소 등 다양한 기능 지원
- 많은 제트팩 라이브러리에 적용되어 있다.
그래들 파일의 dependencies 항목에 다음을 등록해야 코루틴 사용이 가능하다.
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'
코루틴을 구동하려먼 먼저 스코프를 준비한다.
그리고 스코프에서 코루틴을 구동한다.
스코프는 성격이 같은 코루틴을 묶는 개념이다.
코루틴 스코프는 CourineScope를 구현한 클래스의 객체이며 직접 구현할 수 있다.
GlobalScope, ActorScope, ProducerScope 등 코틀린 언어가 제공하는 스코프를 이용할 수 있다.
val backgroundScope = CoroutineScope(Dispatchers.Default + Job())
backgroundScope.launch {
...
}
val mainScope = GlobalScope.launch(Dispatchers.Main) {
...
}
디스패처는 이 스코프에서 구동한 코루틴이 어디에서 동작해야 하는지 나타낸다.
Dispatchers.Main
Dispatchers.IO
Dispatchers.Default