오랜만의 포스팅 입니다.

안드로이드를 개발하다 보면, WeakReference를 사용해야 하는 경우가 있습니다. 

WeakReference를 왜 언제 사용해야 하느냐를 구글링을 해보면, 많은 이유가 나옵니다. 하지만 초보가 이해하기 복잡합니다. 그냥 간단히 말하면... Thread-safe하게 내가 사용하고 있는 변수를 가비지 컬렉션할수 있게 하고싶어서 사용한다 입니다. 다시 쉽게 말하면 예를 들어서 핸들러 or AsynTask로 동작하는 작업이 있다고 하면 (예를들어 리스트에서 이미지 로딩같은 것) 백키를 누르거나 다른 버튼을 눌러, 다른 화면으로 이동을 해야 하는 경우가 있습니다. 이때 이미지의 로딩은 프로세스가 아닌, 쓰레드에서 처리를 하고 있는 것이죠. 다시 말하면, 바로 종료가 안되다는 것입니다. 이때가 WeakReference를 사용하는 최적화 타이밍 입니다. 그래서 안드로이드에서 사용하는 이미지 로더들이 WeakReference를 사용하는 것입니다. 물론 핸들러에서 사용하는것도 권장합니다. 왜냐면 핸들러도 프로세스가 종료되더라도, 바로 종료가 되지 않기 때문입니다. 위에서 언급한 이유와 같습니다.

예를 들어서 핸들러를 아래와 같이 abstract로 선언하고 사용한다면, Thread-Safe 한 핸들러를 사용할수 있을것 같네요.


public abstract class ThreadSafeHandler<T> extends Handler {


private WeakReference<T> mReference;


public ThreadSafeHandler(T reference) {

mReference = new WeakReference<T>(reference);

}


@Override

public void handleMessage(Message msg) {

T reference = null;


if (mReference != null) {

reference = mReference.get();

}

else {

reference = null;

}


if (reference == null) {

return;

}


handleMessage(reference, msg);

}


protected abstract void handleMessage(T reference, Message msg);


}

이런식으로 추상핸들러를 작성해서, 사용하면 될것 같네요~~~ 필요한 메소드는 알아서 더 추가해 주면 될것 같고요...


그럼 즐프~~~

by Invincible Cooler 2015. 7. 28. 05:38