• 记一次使用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);
                }
            };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    上面是拿了八分之一的程序内存当cache大小,也可以自己定义。
    分析源码,
    在这里插入图片描述

    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();   
       			}  
         }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    并且是线程安全的。

    两个方法来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));
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    2023/10/15
    JS 使用Reg表达式匹配后直接取值
    洛谷——CF1750A Indirect Sort
    解决ubuntu更新内核后,NVIDIA显卡失效问题
    ACmix 论文精读,并解析其模型结构
    多叉树组合运算(未完待续)
    SRV1:拥有一个阿里云服务器
    uniapp 使用安卓模拟器运行调试
    Swift异步序列构造器AsyncStream内部定时器(Timer)无法被触发的解决
    【LeetCode每日一题】——38.外观数列
  • 原文地址:https://blog.csdn.net/v_3483608762/article/details/128201408