오랜만의 포스팅 입니다.

안드로이드를 개발하다 보면, 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

오늘은 핸들러를 통해서 핸들러를 취소하는 루틴을 알아보도록 하겠다.


보통 핸들러 사용은 Handler를 생성한후 postDelayed 를 사용하여 UI 업데이트나 시간 delay처리를 한다. 그런데 이렇게 postDelayed를 사용하여 실행된 Runnable 객체를 removeCallbacks를 통해서 제거하고 싶을 때가 있다. 그런데 여기서 문제


removeCallbacks는 pending된 객체만을 제거하는것이다. 다시 말하면 이미 실행되고 있는 Runnable 객체는 최종 끝마치게 된다. 헐~~~ 그러면


이미 실행되고 있는 놈도 날려 버리고 싶다면???


Handler를 통해서 postDelayed를 사용하는 대신 sendMessageDelayed를 사용하고, removeMessages를 통해서 객체를 제거해 보자. API에는 메시지 큐에 있는 pending 객체를 제거한다고 하지만, 실제로 sendMessageDelayed를 통해서 실행되는 놈은 Runnable이 아니여도 되기 때문에 실시간으로 날아가는 효과를 누릴수 있다.

코딩으로 보여주면

mHandler.postDelayed xxxxxxxx

mHandler.removeCallbacks xxxxxxxx

이렇게 호출하면 xxxxxx(Runnable객체) 이놈이 실행되지만

mHandler.removeMessages(xxxx);

mHandler.sendMessageDelayed(msg, 500);

뭐 이런식으로 실행하면 잘된다. ㅋㅋㅋㅋㅋ


그럼 즐프...



by Invincible Cooler 2015. 4. 17. 16:06

parseSdkContent failed

Could not initialize class android.graphics.Typeface


위와같은 에러가 나면 아래와 같이 하면 감쪽같이 사라진다.

1. Download the SDK platform for API 20 (4.4W)

2. Navigate to your sdk folder (should be like D:\EclipseWorkspace\adt-bundle-windows-x86_64-20140321\sdk)

-> Window -> Preferences -> 왼쪽 Android -> SDK Location 확인한다.

3. Go to platforms folder -> android-21 folder -> data folder

4. rename layoutlib.jar (for backup purpose) -> 대충 layoutlib_21.jar 이런식으로 바꾸고

5. copy the same file (layoutlib.jar) from your android-20 folder to this folder

6. restart Eclipse


굿이다 굿...

by Invincible Cooler 2014. 12. 3. 16:21
| 1 |