반응형
보통 bitmap을 캐시 하는데 사용한다는데, 나는 drawable을 캐싱했다. 되던데... bitmap을 캐싱하는 이유가 있을 것 같은데 모르겠다. 사이즈 문제...려나? 베남식에서도 문제는 없던데. 아무튼.
LruCache는 해쉬맵을 사용해서 key와 value로 구분해서 캐쉬한다.
size는 기본적으로 캐싱할 아이템 '개수'를 의미한다. 따로 오버라이드 하지 않는다면 사이즈는 이미지 크기에 관계없이 개수만 체크할 것이다.(캐쉬 사이즈가 거어어업나 커지면 어떨런지...)
방법은 기본적으로 간단. 아래 예제 코드를 올리지만 굳이 저렇게 할 필요는 없다. 그냥 put, get 하는 부분만 잘 설정하면 된다.
무엇보다 이미지 캐싱에 쓰이기 때문에 비동기 작업에 사용하는 것 때문에 다중 쓰레드에 대해 처리를 해야할지 고민할텐데, LruCache는 기본적으로 멀티 쓰레드에 안전하다. api를 뒤져보면 대부분 syncronized 되어 있다. 공식 문서에도 안전하다고 표기되어있고.
public class DrawableCache {
private static final DrawableCache mc = new DrawableCache();
private LruCache mCache;
private int mCacheSize;
public DrawableCache(){
mCacheSize = 30;
setDrawableCache(mCacheSize);
}
public DrawableCache(int size){
mCacheSize = size;
setDrawableCache(mCacheSize);
}
public static DrawableCache getInstance(){
return mc;
}
public void setDrawableCache(int size){
mCache = new LruCache(size);
}
public void addDrawableCache(String key, Drawable img){
if(null == getDrawableFromCache(key)){
mCache.put(key, img);
}
}
public Drawable getDrawableFromCache(String key){
if(null != mCache.get(key)){
return mCache.get(key);
}
return null;
}
public int getSize(){
return mCache.size();
}
}
반응형
댓글