Skip to content

LruCache

原文链接

创建一个LruCache

LruCache实际上是一个Map,指定它的键值对类型。

private LruCache<String,Bitmap> mCaches;

从缓存中获取数据

public Bitmap getBitmapFromCache(String url){
    return mCaches.get(url);
}

把图片添加到缓存

public void addBitmapToCache(String url,Bitmap bitmap){
    //如果缓存中没有该图片就噗特进去
    if(getBitmapFromCache(url) == null){
        mCaches.put(url,bitmap);
    }
}

获取最大内存

获取当前应用所可以使用的最大内存,并设置一个缓存的大小值来初始化LruCache。

int maxMemory = (int) Runtime.getRuntime().maxMemory();
int cacheSize = maxMemory / 4;
mCaches = new LruCache<String,Bitmap>(cacheSize){
    @Override
    protected int sizeOf(String key,Bitmap value){
        // 在每次存入缓存的时候调用,告诉系统当前存的对象到底有多大
        // 所以返回一个实际的大小
        return value.getByteCount();
    }
}

获取图片

//获取图片的时候,第一步会去内存缓存中取出图片
Bitmap bitmap = getBitmapFromCache(url);
if(bitmap == null){
    //如果缓存中没有,就直接使用异步任务从网络上下载图片
}else{
    //如果缓存中有,就直接使用图片
}

下载图片的同时保存至LruCache

//在异步任务的下载逻辑中,还需要将下载完毕的图片保存到LruCache中
@Override
protected Bitmap doInBackground(String... params){
    String url = params[0];
    //从网络上获取图片
    Bitmap bitmap = getBitmapFromURL(url);
    if(bitmap != null){
        //将不在缓存的图片加入缓存
        addBitmapToCache(url,bitmap);
    }
    return bitmap;
}

通过这个方法就可以把下载过的图片存入缓存 刷新时就不用每次都从网上下载 典型的”以内存换效率” listview常用