아래 코드처럼 Handler 객체를 생성하면 "This Handler class should be static or leaks might occur" 경고 메시지가 뜬다. Handler 객체가 정적인 상태가 아니면 메모리 누수가 발생할 수 있다고 경고하는 것인데 해결법을 알아보자.

private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
mIsPressBackKey = false;
// 2초가 지나면 다시 Falg 를 false로 바꾼다.
debugMessage("handleMessage mFlag : " + mIsPressBackKey);
break;
}
}
};


 메시지 큐에 타켓 핸들러를 가지고 있는 메시지들이 있는 동안, 그 핸들러는 가비지 콜랙션되지 않는다. 

만약에 핸들러가 정적 상태가 아니라면 Activity나 Service는 종료 되더라도 가비지 콜렉션 되지 않는다. 따라서 가비지콜렉터가 메모리를 정리하기 위해서 아래 해결법 처럼 수정해야 한다.



해결법

static class BackkeyProcHandler extends android.os.Handler {
private final WeakReference<MainActivity> mMainFrameActivity;

public BackkeyProcHandler(MainActivity activity) {
mMainFrameActivity = new WeakReference<MainActivity>(activity);
}

@Override
public void handleMessage(Message msg)
{
MainActivity act = mMainFrameActivity.get();
if(act == null) return;

switch (msg.what) {
case 0:
// 2초가 지나면 다시 Falg 를 false로 바꾼다.
act.mIsPressBackKey = false;
break;
}
}
}


참조 : http://stackoverflow.com/questions/11407943/this-handler-class-should-be-static-or-leaks-might-occur-incominghandler

http://d2.naver.com/helloworld/329631


+ Recent posts