在一些图片缓存的开源框架中一直都出现这样的一个类的使用,查看了官方文档后对其有了一定的了解。
int cacheSize = 4 * 1024 * 1024; // 4MiB
LruCache bitmapCache = new LruCache(cacheSize) {
protected int sizeOf(String key, Bitmap value) {
return value.getByteCount();
}}
根据官方文档中的说明,对这段代码的含义是:创建一个大小为4M的存储空间来进行图片的存储,存储按照队列的形式,后存储进来的和最新使用过的将会放在队列的最后,这样陈旧数据放在队列的开始,用于GC的回收。
synchronized (cache) {
if (cache.get(key) == null) {
cache.put(key, value);
}}
这个方法也展示了怎样规范化的使用以及获取由LruCache保存的数据,由于这个类是线程安全的所以需要加上同步块来进行存放数据,通过get和put方式来进行数据的存取,这点跟Map是一致的,put时如果键相同则会进行数据的覆盖,但是有点需要注意这里key和value都不能为空,这里跟Map有点区别。
还必须注意必须要主动的释放资源,重写方法
entryRemoved (boolean evicted, K key, V oldValue, V newValue)
如果资源是被系统回收的则evicted会返回TRUE,如果是由put,remove的方式替换回收的则evicted会返回FALSE,然后怎么知道是通过put还是remove的,可以通过对newValue是否为空进行判断,如果为空则是put调用,然后将remove和系统回收时将资源置为空,就要自己去实现了。
详情请参考:LruCache官方文档