Android缓存框架 LruCache

笑谈风云,一语定乾坤。大家好,我是皖江。从今天开始,我将和大家一起分享我的Android框架学习经验之路。万丈高楼平地起,我就从小小的缓存策略开始学习吧。

简介:说起Android的缓存,主要用到的图片的缓存。当然,其他一些视频、音频文件也是可以做的。今天我主要以图片缓存为例子来进行学习。应用里所需要的图片大多都是需要从网络进行下载的,不管用户有多少流量,都敌不过中国移动一天接近一个亿的收入。一个很耗流量的APP,不是个好APP,是要被用户打入冷宫的。这是其一,其二就是在一个页面显示多图也是需要通过缓存来实现图片的加载,否则android系统给与APP运行的内存很快就会被消耗殆尽,然后APP就光荣的om了。

三级缓存机制:首先从内存中加载文件,如果没有则在硬盘中加载文件,如果没有则访问网络下载文件。从速度上来看也是逐级往下减的,但是这种三级缓存模式也是非常受用的。不单单可以用于图片,也可以用于其他文件。

Android系统本身提供了缓存技术,叫LruCache。LruCache在API12就引入了,低版本可以在support依赖包中获取。

LruCache的算法原理就是把最近使用的对象用强引用存储在LinkedHashMap中,并且会将很少使用的对象在缓存值将满之前从内存中移除掉。在LinkedHashMap中,先入的对象会保存在底部,新入对象放在顶部。当内存将满时,优先从底部删除对象。LruCache提供sizeOf()方法来设置缓存个数。

private final LinkedHashMap<K, V> map;

LruCache的构造方法:

public LruCache(int maxSize) {
    if (maxSize <= 0) {
        throw new IllegalArgumentException("maxSize <= 0");
    }
    this.maxSize = maxSize;
    this.map = new LinkedHashMap<K, V>(0, 0.75f, true);
}
传入了一个最大值,用来限制用于缓存的内存大小。一般我们推荐用当前APP可用内存的1/8来做缓存。

通过以下方法获取APP可用内存:

public int getMemory(){
    return ((ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass();
}

下面是个具体的使用方法:

 
 
LruCache<String,Bitmap> lruCache = new LruCache<String,Bitmap>(getMemory()*1024*1024/8){
@Override protected int sizeOf(String key , Bitmap value) { return value.getByteCount()/ 1024 ; }} ;
/**
 * 添加图片到缓存中
 * @param key
 * @param bitmap
 */
public void addBitmapToCache(String key,Bitmap bitmap){
    if(getBitmapFromCache(key) == null){
        lruCache.put(key,bitmap);
    }
}

/**
 * 从内存中获取该图片对象
 * @param key
 * @return
 */
public Bitmap getBitmapFromCache(String key){
    return lruCache.get(key);
}
以上就是LruCache的基本用法。LruCache用上去很简单,所以便于扩展,下次再带来LruCache的扩展 DiskLruCache框架的学习。

猜你喜欢

转载自blog.csdn.net/shirakawakanaki/article/details/52796810