Android LruCache(内存缓存)

来源:互联网 发布:上海争游网络首页 编辑:程序博客网 时间:2024/06/05 11:28

Android LruCache(内存缓存)


LruCache(Android的内存缓存)
1.概念

      内存缓存相对于磁盘缓存而言,速度要来的快很多,但缺点容量较小且会被系统回收,这里的实现我用到了LruCache。
LruCache这个类是Android3.1版本中提供的,如果你是在更早的Android版本中开发,则需要导入android-support-v4的jar包

Lru: 是Least Recently Used 的简称 ,近期最少使用的
原理:把近期最少使用的数据从缓存中移除,保留使用最频繁的数据
          LruCache是基于Lru算法实现的一种缓存机制
          Lru算法的原理是所近期最少使用的数据给移除掉,当然前提是当前数据量大于设定的最大值
          LruCache没有真正释放内存,只是从Map中移除数据,真正释放内存还是要用户手动释放

底部使用的是LinkedHashMap<k,p>(需要排序) 

LruCache的关键字段有 总容量  已使用容量 linkedHashMap
     //核心数据结构
  private final LinkedHashMap map;
  // 当前缓存数据所占的大小
  private int size;
  //缓存空间总容量
  private int maxSize;

需要注意的是size字段,因为map中可以存放各种类型的数据,这些数据的大小测量方式也是不一样的,需要自己定义数据的测量方式


2.关键代码如下

1.初使化,需要指定缓存区空间的大小

/**
* 图片缓存技术的核心类,用于缓存所有下载好的图片,在程序内存达到设定值时会将最近最少使用的图片移除掉
* String用于存放图片的url地址
* Bitmap代表图片
*/
private LruCache<String,Bitmap> mMemoryCache;

//获取应用程序最大可用内存
int maxMemory=(int)Runtime.getRuntime().maxMemory();
//设置图片缓存大小为程序最大可用内存的1/8
int cacheSize=maxMemory/8;
//初使化内存缓存操作,需要给定缓存区空间大小
mMemoryCache=new LruCache<String, Bitmap>(cacheSize){
    @Override
    protected int sizeOf(String key, Bitmap value) {
        return value.getByteCount();//自定义bitmap数据大小的计算方式
    }
};

2.存入图片

//imgurl代表图片的url地址,因为url路径里面可能存在一些特殊字符,所以可以使用md5加密的方式返回一个字符串,md5加密后都是0~f之间的字符
mMemoryCache.put(encode(imgurl),bitmap);


  /**
     * 把一个字符串以md5的放肆加密之后返回...因为url路径里面可能存在一些不可用的特殊字符,所以使用这种方式处理一下
     * @param string
     * @return
     * @throws Exception
     */
    private String encode(String string) throws Exception {
        byte[] hash = MessageDigest.getInstance("MD5").digest(string.getBytes("UTF-8"));
        StringBuilder hex = new StringBuilder(hash.length * 2);
        for (byte b : hash) {
            if ((b & 0xFF) < 0x10) {
                hex.append("0");
            }
            hex.append(Integer.toHexString(b & 0xFF));
        }
        return hex.toString();
    }

3.获取图片

Bitmap map=mMemoryCache.get(encode(imgurl));
原创粉丝点击