ANR & Coroutine

k_hyun·2023년 3월 2일
0

ANR (Activity Not Response)

액티비티가 응답하지 않는 오류 상황을 의미한다.
액티비티가 사용자 이벤트에 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

  • CPU를 많이 사용하는 작업을 백그라운드에서 실행

0개의 댓글