관리 메뉴

나만을 위한 블로그

[Manifest-Android] 14. ANR 본문

스터디

[Manifest-Android] 14. ANR

참깨빵위에참깨빵_ 2025. 6. 23. 20:31
728x90
반응형

ANR은 메인 쓰레드가 너무 오래 차단되어 발생하는 에러다. 일반적으로 5초 이상 차단될 경우 발생하고 ANR이 발생하면 안드로이드는 앱을 닫거나 응답 대기를 안내한다. ANR이 발생하는 원인은 아래 중 하나일 수 있다.

 

  • 메인 쓰레드에서 5초 이상 지속되는 무거운 계산 작업
  • 장시간 실행되는 네트워크, DB 작업
  • 메인 쓰레드에서의 동기식 작업으로 인한 UI 작업 차단

 

ANR 방지 방법

 

메인 쓰레드의 응답성을 위해 무거운 작업은 메인 쓰레드에서 수행하지 않는 게 필수적이다. 아래는 몇 가지 권장사항이다.

 

  • 메인 쓰레드에서 무거운 작업 실행하지 않기 : 파일 I/O, 네트워크 요청 같은 걸 처리할 땐 백그라운드 쓰레드를 활용한다. 코루틴, IO 디스패처를 써서 백그라운드 작업 관리를 효율적으로 할 수 있다
  • 지속적 작업에는 WorkManager 사용 : 데이터 동기화 등 백그라운드에서 실행돼야 하는 작업에는 WorkManager를 써라. 이 API는 작업이 메인 쓰레드 밖에서 스케줄링되고 실행될 것을 보장한다
  • 데이터 로딩 최적화 : 대규모 데이터 세트를 효율적으로 가져오기 위해 페이징을 구현하라. 데이터를 작고 관리 가능한 조각으로 나눠 가져오면 UI 과부하를 방지하고 성능을 개선할 수 있다
  • 구성 변경 시 UI 변경 최소화 : 뷰모델을 써서 UI 관련 데이터를 유지하고 화면 회전 같은 구성 변경 시 불필요한 UI 재로드가 발생하지 않게 한다
  • 안드로이드 스튜디오로 모니터링, 프로파일링 : 안드로이드 스튜디오의 프로파일러를 써서 CPU, 메모리, 네트워크 사용량을 모니터링해서 ANR을 유발할 수 있는 성능 병목 현상을 식별하고 예방한다
  • 블로킹 호출 방지 : 메인 쓰레드에서 긴 루프, sleep 호출, 동기식 네트워크 요청 같은 블로킹 작업을 방지해서 앱 성능을 원활하게 유지한다
  • 핸들러를 통한 작은 딜레이 도입 : Handler.postDelayed()를 써서 메인 쓰레드 차단 없이 작은 딜레이를 도입해서 반응형 앱 경험을 제공한다

 

핸들러 대신 코루틴의 delay()를 써서도 같은 효과를 낼 수 있다.

반응형
Comments