본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android/안드로이드] 응답성을 고려한 설계 ( ANR 을 피하는 설계 )

by 돼지왕 왕돼지 2012. 2. 9.
반응형


안녕하세요 돼지왕왕돼지입니다.
오늘은 응답성을 고려한 설계, 즉 ANR 을 피하는 설계에 대해 알아보고자 합니다.


ANR 이 뭔가요?

 
ANR 은 Application Not Responding 의 약자로, UI Thread 혹은 Main Thread 에서 오랜 시간 작업을 하여, UI Event 처리나 Draw 를 방해하는 시간이 길어지면 발생하는 일종의 Error Event 입니다.
 

이미지 출처 : http://developer.android.com/guide/practices/design/responsiveness.html




구체적으로 어떤 상황에서 ANR 이 발생하는가?


입력 이벤트 ( 키 입력 or 스크린 터치 등 ) 에 대해 Activity가 5초 이내에 반응이 없을 때 발생합니다.
Activity 이외에도 ANR 이 발생하는 상황이 있는데, ( 이부분은 보통 개발자들이 간과하는 상황인데.. )
broadcast receiver가 10초 이내에 실행을 끝내지 않을 때에도 발생합니다.

 





어떻게 ANR을 피할 수 있나요?

 
Main thread에서 실행되는 임의의 method는 최소한의 일을 해야 합니다.
특히 onCreate(), onResume() 과 같은 핵심 생명주기 method에서 가능한 적은 일 수행하는 것이 좋습니다.
네트워크나 데이터베이스 operation 같은 잠재적으로 길게 실행될 가능성이 있는 작업들이나, 비트맵 크기를 조정하는 것 같은 계산상 값비싼 연산쓰레드를 새로 생성해서 처리하는 것이 좋습니다. 물론 쓰레드에서 처리가 완료되었을 때 결과값을 받도록 handler를 설치 및 전달하는 것도 중요하지요.

BR이 오랜 작업을 수행해야 하는 경우라면, service를 만드는 것이 좋습니다.
BR이 activity를 띄워야 한다면, notification manager를 사용해서 사용자에게 보여주는 것으로 변경해야 합니다.

[왜 Braodcast Receiver 에서 activity를 띄우면 안 될까요?]


 

ANR 피하는 것을 넘어 응답성을 강화하는 방법에 대해서.

  
 일반적으로 100ms ~ 200ms 가 사용자가 지연을 느낄 수 없는 Threadhold 라고 합니다. 즉 모든 작업은 200ms 이상 걸리면 안 좋다는 거죠. User 가 "버벅거린다" 를 느낀다는 말입니다. 사용자 입력에 응답하여 백그라운드에서 일을 한다면, 진행이 되고 있음을 보여주는 것이 좋습니다.  ( ProgressBar와 ProgressDialog 등으로 ) 그렇지 않다면 User는 프로그램이 stuck 되었다고 느끼기 쉽죠. 특히 게임에서는 추가 쓰레드에서 움직임에 대한 계산을 하는 것이 좋습니다. 게임에서의 계산은 보통 항상 반복적으로 일어나며, 오래 걸리는 계산일 확률이 높죠. 시간이 걸리는 초기 셋업단계라면 착수화면 ( Intro Screen or Splash Screen )을 보여주거나, 가능한 한 빨리 메인 뷰를 렌더링하고 비동기적으로 정보를 채워넣는 것을 고려하는 것이 좋겠습니다.



모두들 버벅대지 않는, 응답성이 좋은 프로그램을 만들어봅시다요~

 
로그인 없이 추천 가능합니다. 손가락 꾸욱~


반응형

댓글