반응형

 

안드로이드 핸들러를 잘 모르고 사용하시는 분들 중 제목과 같은 현상을 겪은 사람이 많을 것이다.

핸들러의 주 목적은 서브 쓰레드에서 주 쓰레드로 데이타를 전달해주는 것이다.

 

 예를 들면 아래와 같다.

토스트 같은 경우는 안드로이드에서 메세지 띄워주는 용도로 매우 유용한데,

메인 쓰레드에만 사용할 수 있으며 그 외의 쓰레드에서 사용하게 되면 오류를 내며 튕겨버린다.

서브 쓰레드에서 쓰기 위해 보통 아래와 같이 핸들러를 구성하고

서브 쓰레드에서 ProcessMessage() 함수를 호출하면 정상적으로 토스트가 동작한다.

 

하지만 코드에서 핸들러 부분이 블럭 처리되어있어서 무언가 찝찝하다.

마우스를 한번 갖다대보자.

 

핸들러를 정적으로 사용하지 않으면 메모리 릭이 발생할 수 있다는 의미이다.

'More'를 눌러서 더 자세한 내용을 보면 아래와 같다.

 

This Handler class should be static or leaks might occur (anonymous android.os.Handler) less... (Ctrl+F1)
Since this Handler is declared as an inner class, it may prevent the outer class from being garbage collected. If the Handler is using a Looper or MessageQueue for a thread other than the main thread, then there is no issue. If the Handler is using the Looper or MessageQueue of the main thread, you need to fix your Handler declaration, as follows: Declare the Handler as a static class; In the outer class, instantiate a WeakReference to the outer class and pass this object to your Handler when you instantiate the Handler; Make all references to members of the outer class using the WeakReference object.

 

정리하면 핸들러는 내부 클래스로 선언되어 가비지 컬렉터에 의해 소멸되지 않을 수 있다는 것이다.

그래서 핸들러를 정적 내부 클래스로 선언하면 해당 이슈를 해결할 수 있다.

추가로 정적 내부 클래스로 선언하게 되면, 외부 클래스의 정적멤버 외에는 접근할 수 없다.

그래서 혹시나 외부 클래스의 멤버에 접근하고 싶다면 WeakReference 객체를 이용하면 된다.

여기서는 단순히 토스트를 띄우는 것이 목적이므로 해당 객체를 사용하지는 않을 것이다.

 

서론이 길었는데 어쨌든 해결 방법은 간단하다.

위의 핸들러 관련 코드를 아래와 같이 수정하면 된다.

 

    private final MyHandler handler = new MyHandler();

    private static class MyHandler extends Handler {
        public MyHandler() {
        }

        @Override
        public void handleMessage(Message msg) {
            if(msg.arg1 == 1)
                Toast.makeText(Global.getContext(), "오류가 발생하였습니다.", Toast.LENGTH_SHORT).show();
            else if(msg.arg1 == 2)
                Toast.makeText(Global.getContext(), "정상적으로 처리되었습니다.", Toast.LENGTH_SHORT).show();
        }
    }

 

이처럼 단순히 정적 내부 클래스로 선언하면 된다.

그럼 메모리 릭의 걱정도 없고, 문제 없이 핸들러를 사용할 수 있다.

반응형

+ Recent posts