安卓图片三级缓存策略与实现

前言:

这里说的三级缓存,分别指的是:内存缓存、文件缓存和网络这三个层面。

一般来说,我们首次加载图片,内存和文件是没有缓存的,这样我们需要从网络加载,加载完成后,我们会存到内存和文件中去;当再次加载图片的时候,我们会先查找内存有没有,如果有就直接显示内存中的图片,如果没有,我们会接着查找文件中是否有,如果文件中有,我们会显示文件中的图片,并且把它存到内存中去,这样下次我们在内存中就能找到它了。

我们之所以要做缓存,主要是为了提高效率,节省流量。但是为什么要做三级呢?为什么不只存在内存或者只存在文件中呢?这是因为内存的读取速度快,但是容易被回收,容量小,文件的读取速度次之,不过容量大,不到不得已不会被回收。

有了以上的介绍,我们已经知道了三级缓存的必要性和实施步骤,接下来,我们就要选择在每级缓存的缓存策略了。

内存缓存,最开始大家推崇的是用SoftRefrence(软引用),它只有在内存不够的情况下才会被GC回收。但是高版本的安卓系统更倾向于回收SoftRefrence,这使得SoftRefrence不那么好用了。不过,安卓在3.0之后提供了LRUCache,它采用了最近最少使用的淘汰策略。本篇文章我们的内存缓存使用的就是LruCache. 

文件缓存,我们使用的是DiskLruCache 点击这里下载

网络请求,这里我们使用Volley网络请求框架 点击这里下载。不懂的可以看这里 Android Volley入门到精通:定制自己的Request

点击这里下载本文的源代码

内存缓存LruCache

我们定义ImageCacheUtil类来进行图片的缓存,它实现了Volley的ImageLoader.ImageCache接口,改接口需要实现两个方法:
1.getBitmap : Volley请求的时候会先回调getBitmap看缓存是否有图片,没有的话才会去网络请求
2.putBitmap : Volley下载完图片的回调,实现该方法可以进行图片缓存

使用LruCache需要以下步骤
1.通过new LruCache得到LruCache的实例
        // 获取应用可占内存的1/8作为缓存
        int maxSize = (int) (Runtime.getRuntime().maxMemory() / 8);
        // 实例化LruCaceh对象
        mLruCache = new LruCache<String, Bitmap>(maxSize) {
                @Override
                protected int sizeOf(String key, Bitmap bitmap) {
                return bitmap.getRowBytes() * bitmap.getHeight();
            }
        };
2.在getBitmap函数中通过mLruCache.get(url)得到内存的图片,没有时返回空。
3.在putBitmap函数中通过mLruCache.put(url,bitmap)把图片存入内存。
具体用法可
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值