美文网首页
Bitmap缓存策略

Bitmap缓存策略

作者: _Rice_ | 来源:发表于2019-05-13 10:56 被阅读0次

首先理解三级缓存:内存-本地-网络

  • 加载图片首先判断内存是否有缓存,如果内存没有,判断本地是否有缓存,如果还是没有再从网络加载。
  • 如果图片是从本地获取的,那么获取后保持到内存缓存,如果图片是从网络加载的,那么获取后保持到内存、本地缓存中
  • 内存缓存推荐使用LruCache,本地缓存推荐使用DiskLruCache

目前流行的图片框架都是使用了三级缓存策略

LruCache

数据对象是LinkedHashMap,最近最少使用算法,使得最近访问的数据会在链表尾部,在容量溢出时,将链表头部的数据移除。

使用方法:

  • 计算当前可用的内存大小;
  • 分配LruCache缓存容量;
  • 创建LruCache对象并传入最大缓存大小的参数、重写sizeOf()用于计算每个缓存对象的大小;
  • 通过put()、get()和remove()实现数据的添加、获取和删除。

//初始化

    //返回Java虚拟机将尝试使用的最大内存量
        long maxMemory = Runtime.getRuntime().maxMemory() / 1024;
        //这里的大小官方推荐是用当前app可用内存的八分之一
        int cacheMaxSize = (int) (maxMemory/8);
        mLruCache = new LruCache<String, Bitmap>(cacheMaxSize) {

            //完成Bitmap对象大小计算
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getRowBytes()*value.getHeight()/1024;
            }

            //在移除旧缓存的时候会调用,可以在这个方法做一些资源回收工作
            @Override
            protected void entryRemoved(boolean evicted, String key, Bitmap oldValue, Bitmap newValue) {
                super.entryRemoved(evicted, key, oldValue, newValue);
            }
        };


//获取缓存对象
mLruCache.get(key);

//添加缓存对象
mLruCache.put(key,value);

//移除缓存对象
mLruCache.remove(key);

DiskLruCache

通过将缓存对象写入文件系统从而实现缓存效果

创建DiskLruCache
 public static DiskLruCache open(File directory, int appVersion, int valueCount, long maxSize)
  • directory:磁盘缓存的存储路径。
  • appVersion:当前应用的版本号,一般设为1。如果appVersion发生变化,会自动删除前一版本的数据
  • valueCount:单个节点所对应的数据的个数,一般设为1。
  • maxSize:缓存的总大小,超出这个设定值后DiskLruCache会清除一些缓存
利用Editor实现数据的添加

由于url中的字符可能会带文件名不支持的字符类型,所以取url的MD5值作为文件名

//返回url的MD5算法结果
String key = hashKeyForDisk(url);
//获取Editor对象
Editor editor = mDiskLruCache.edit(key);
OutputStream outputStream = editor.newOutputStream(0);
//写入数据
outputStream.wirte(data);
//提交写操作,若发生异常,则调用Editor.abort()进行回退。
editor.commit();
//将数据写入磁盘
mDiskLruCache.flush();
利用Snapshot实现数据获取。
//1.返回url的MD5算法结果
String key = hashKeyForDisk(url);
//2.获取Snapshot对象
Snapshot snapshot = mDiskLruCache.get(key);
InputStream inputStream = snapshot.getInputStream(0);
//4.读出数据
int data = inputStream.read();

推荐阅读:

Android DiskLruCache 源码解析 硬盘缓存的绝佳方案

相关文章

网友评论

      本文标题:Bitmap缓存策略

      本文链接:https://www.haomeiwen.com/subject/adqlaqtx.html