안드로이드2013.09.08 03:48

안드로이드 비크맵 캐시를 위해 많이 사용하는 LruCache.

http://developer.android.com/reference/android/support/v4/util/LruCache.html


그리고, LruCache 생성시 지정해주는 maxSize.


아는 사람은 알고, 모르는 사람은 개고생 하게 되는 maxSize의 비밀.


LruCache 를 생성할 때 지정해야 하는 maxSize 값의 이미는

얼핏 보기에 캐시될 아이템의 갯수로 느껴진다.


이는 경우에 따라 정답이기도, 아니기도 하다.


LruCache 의 sizeOf(K,V) 를 override 하지 않는다면, maxSize 는 아이템의 갯수이다.


하지만, sizeOf 를 override 하는 경우, 

sizeOf 의 return 방법에 따라, 

maxSize 는 아이템의 갯수가 될 수도 있고, 

메모리의 크기가 될 수도 있고, 또 다른 무언가가 될 수도 있다.



protected int sizeOf (K key, V value)

Returns the size of the entry for key and value in user-defined units. The default implementation returns 1 so that size is the number of entries and max size is the maximum number of entries.

An entry's size must not change while it is in the cache.

key 에 해당하는 엔트리의 사이즈를 사용자가 지정한 단위로 리턴한다. 기본으로는 엔트리의 사이즈를 1로 반환하며, 곧 캐시된 엔트리의 갯수 자체를 의미해서 max size 가 곧 최대 엔트리 갯수를 의미한다.

캐시되어 있는 동안 엔트리의 사이즈는 변하지 않는다. 



이걸 모르고

인터넷에 돌아다니는 샘플 코드를 가져다 썼는데 도무지 캐싱이 안되어서 고생 했다.


그 샘플 코드는 maxSize 가 100 이었으면서도

sizeOf 에서는 bitmap 의 byte 를 리턴하고 있었다.


당연히 아무리 작은 이미지 였음에도 100 byte를 초과하니 캐싱 자체가 될리 없었던것.




Posted by Dr.Kein

댓글을 달아 주세요