记一次使用LruCache并探究

一.大致说一下,公司让我写一个扫码并检测的App,显示二维码一百万次,显示一维码一百万次。显示用的ZXing开源库,扫码使用的公司生产的Pos机。

二.之前都是用zxing库直接生成的二维码和一维码,所以要生成两百万次,但是虽然是两百万次但是可以有重复的。实际上就是64张码不停的扫两百万次。所以有很多重复的码。

三,之前没有使用LruCache缓存,以至于要生成两百万次,所以时间要用一个月!!!很慢。上网查了下就是Lru可以契合使用。

四,下面介绍LruCache
LruCache底层是LinkedhashMap,
LruCache可以直接在Android里面用,因为已经集成了在Android的jar包里面了。
怎么用

//缓存大小
    int maxSize = (int) Runtime.getRuntime().maxMemory();
    int cacheSize = maxSize / 1024 / 8;

stringBitmapLruCache = new LruCache<String,Bitmap>(cacheSize){
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return super.sizeOf(key, value);
            }
            @Override
            protected void entryRemoved(boolean evicted, String key, Bitmap oldValue, Bitmap newValue) {
                // 当调用put或remove时触发此方法,可以在这里完成一些资源回收的操作
                super.entryRemoved(evicted, key, oldValue, newValue);
            }
        };

上面是拿了八分之一的程序内存当cache大小,也可以自己定义。
分析源码,
记一次使用LruCache并探究_第1张图片

  1. 这是一个对持有的有限数据强引用的缓存,每一次一个数据通过,就会被移到队列的头部。
  2. 当数据加到已经满的缓存中,在队列尾部的数据就会被删除,并且可能会被gc垃圾回收。
  3. 如果你的缓存数据一定会被释放掉,那就重写 entryRemoved方法。
  4. 重写sizeof来确定cache不同的大小

官方给的例子

int cacheSize = 4 * 1024 * 1024; // 4MiB   
LruCache<String, Bitmap> bitmapCache = new LruCache<String, Bitmap>(cacheSize) {
       protected int sizeOf(String key, Bitmap value)
        {           	return value.getByteCount();   
   			}  
     }

并且是线程安全的。

两个方法来put和get

    public void addBitmapToMemoryCache(StringBuffer key, Bitmap bitmap) {
        stringBitmapLruCache.put(String.valueOf(key), bitmap);
    }

    public Bitmap getBitmapFromMemCache(StringBuffer key) {
        return stringBitmapLruCache.get(String.valueOf(key));
    }

你可能感兴趣的:(Android,android,java,开发语言)