zoukankan      html  css  js  c++  java
  • Bitmap的加载和Cache--学习笔记2

    缓存策略:

    LRU算法:会优先淘汰那些近期最少使用的缓存对象,包含两种LruCache和DiskLruCache

    LruCache(实现内存缓存,建议使用-v4兼容包提供的LruCache):

       LruCache是一个泛型类,它内部采用一个LinkedHashMap以强引用的方式存储外界的缓存对象,其提供了get和put方法来完成缓存的获取和添加操作,LruCache会移除较早使用的缓存

    对象,然后再添加新的缓存对象。下面解析一下强引用、软引用和弱引用的区别

     -- 强引用:直接的对象引用

     -- 软引用:当一个对象只有软引用存在时,系统内存不足时此对象会被gc回收(gc--垃圾回收机制)

     -- 弱引用:当一个对象只用弱引用存在时,此对象会随时被gc回收。

    另外LruCache是线程安全的(多线程访问统一代码,不会产生不确定的结果)。

       LruCache的初始化:

    int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
    int cacheSize = maxMemory / 8;
    mMemoryCache = new LruCache<String, Bitmap>(cacheSize){
    @Override
    protected int sizeOf(String key, Bitmap bitmap){
    return bitmap.getRowBytes() * bitmap.getHeight() / 1024;
    }
    }

     只需要提供缓存的总容量大小并重写sizeOf方法即可,sizeOf方法的作用是计算缓存对象的大小,这里的大小的单位需要和总容量的单位一致。

    上面代码示例,总容量的大小为当前进程的可用内存的1/8,单位为KB,而sizeOf方法则完成了Bitmap对象的大小计算。除以1024是为了将其单位转换为KB。

    一般情况下,还需要重写LruCache的entryRemoved方法,LruCache移除旧缓存时会调用entryRemoved方法,在entryRemoved中完成一些资源回收工作。

    还有缓存的获取:mMemoryCache.get(key) //获取一个缓存对象

    缓存的添加:mMemoryCache.put(key,bitmap) //添加一个缓存对象

    remove方法即可删除一个指定的缓存对象。

    DiskLruCache(存储设备缓存、磁盘缓存)

    1.DiskLruCache的创建(不能通过构造方法创建):

       public static DiskLruCache open(File directory, int appVersion, int  valueCount,  long maxSize)

       open方法四个参数:directory:表示磁盘缓存在文件系统中的存储路径,可以是SD卡上的缓存目录,也可以是指定其他目录。

       appVersion:表示应用的版本号,当版本号发生改变时DiskLruCache会清空之前所有的缓存文件,一般只设为1。

       valueCount:表示单个节点所对应的数据的个数,一般设为1即可。

       maxSize:表示缓存的总大小,比如50MB,当超出设定值后DiskLruCache会清除一些缓存从而保证总大小不大于这个设定值

    2.DiskLruCache的缓存添加:

       DiskLruCache是缓存添加是通过Editor完成的,Editor表示一个缓存对象的编辑对象。DiskLruCache不允许同时编辑一个缓存对象

  • 相关阅读:
    Spring Boot 内嵌Tomcat的端口号的修改
    仅显示INPUT下边框
    2015面试记三
    2015面试记二
    2015面试记一
    最近工作学习心得体会
    Tomcat批处理文件小结
    启动Tomcat一闪而过——分析及解决过程
    WIN7安装及配置JDK
    Firefox下载文件时中文名乱码问题
  • 原文地址:https://www.cnblogs.com/banzhuan/p/6862382.html
Copyright © 2011-2022 走看看