[Android] ANRWatchDog으로 ANR발생 시 에러 핸들링하기

박상군·2022년 4월 21일
1

Android

목록 보기
7/9
post-thumbnail

디버깅의 호흡 제1형 무지성 주석 처리

제게 가장 무서운 게 무엇인지 물어보면 본능적으로 ANR이라고 말할 정도로 앱 개발자에게 있어 ANR을 가장 보고 싶지 않은 에러일 것입니다.

테스트중에 폰에 ANR 뜨는 순간 한숨부터 나오는...
TMI지만 그래서 닉네임도 Please No ANR..

우선 들어가기전 ANR에 대해 알아보자면 ANR이란??

  • 여기에서 보면 안드로이드에선 MainThread(UI Thread)가 5초 이상 멈추면 ANR(Application Not Responding)을 발생시킵니다.
    예를 들어 MainThread에서 네트워크 통신 처리나 DB에서 데이터를 가져오는 등의 무거운 작업을 하게되면 MainThread가 UI처리를 할 수 없기 때문에 안드로이드 운영체제가 ANR을 발생시키는 것입니다.

그렇다면 ANRWatchDog이란??

  • 위에서 설명한 ANR(Application Not Responding) 발생 시 에러를 핸들링하는 라이브러리입니다. 또한 ANRWatchDog은 Thread이기 때문에 인터럽트가 가능합니다.

사용방법

1. Gradle에 Dependency추가

Module단의 Gradle에 아래와 같이 Dependency를 추가 해줍니다.

	// ANR-WatchDog
    implementation 'com.github.anrwatchdog:anrwatchdog:1.4.0'

2. Application 클래스에 ANRWatchDog 추가

보통 ANRWatchDog은 앱 전역에 발생하는 에러를 핸들링하기 때문에 Application 클래스의 onCreate()함수에 구현을 하여 에러를 캐치하도록 합니다.

public class MyApp extends Application {
	@Override
	public void onCreate() {
		new ANRWatchDog()
	}
}

코드를 살펴보면 new 키워드를 사용하여 객체를 생성해줍니다
이때 들어가는 파라미터는 ANR에 대한 최소 중단 시간이고 기본 값은 5000ms 입니다.
변경하고 싶다면 new ANRWatchDog(10000) 이런식으로 변경이 가능합니다.

3. 디버거 사용

와치독은 기본적으로 디버거가 연결되면 ANR을 무시하는데, 이때 ANR을 캐치하고 싶다면 다음과 같은 코드를 추가하면 됩니다.

new ANRWatchDog().setIgnoreDebugger(true)

디폴트 값은 false입니다.

4. 콜백 사용

ANR 발생 시 해당 에러를 기록하거나 보고하고 싶다면 다음과 같은 리스너를 추가하여 onAppNotResponding() 함수에 해당 에러에 대한 처리를 구현하면 됩니다.

new ANRWatchDog().setANRListener(new ANRWatchDog.ANRListener() {
            @Override
            public void onAppNotResponding(ANRError error) {
                // Handle the error
            }

5. 최종

최종적으로 보면 다음과 같이 구현됩니다.
Thread이기 때문에 마지막에 start()를 사용하여 실행시켜 줍니다.

new ANRWatchDog()
.setIgnoreDebugger(true)
.setANRListener(new ANRWatchDog.ANRListener() {
            @Override
            public void onAppNotResponding(ANRError error) {
                // Handle the error
            }
        }).start();

Reference

ANRWatchDog-Github

0개의 댓글