请注意,Volley已默认使用磁盘缓存

之前学习volley框架,用ImageLoader可以设置内存缓存,用一个LruCache,就可以避免OOM且图片读取速度快,爽极了。

后来想,如果只是内存缓存的话,那退出程序或者内存不够大了,缓存的图片不就被清理掉了,这样每次启动程序就又得去网上下载图片,流量好贵的。

于是找到了磁盘缓存框架DiskLruCache,这是一个挺著名的开源框架,网易云阅读等APP之前都用它来缓存图片,关于这个框架的使用可以看这篇博客

找到这个框架后我就着手把DiskLruCache和Volley结合起来,用LruCache做一级缓存,用DiskLruCache做二级缓存,这样做使得程序又快又不用每次都去网上下载图片浪费流量。说干咋就干,做前股沟了一下,找到了一篇关于此实现的相关介绍,原来有老外也想到了这点(介绍链接),并把他的代码再github上开源出来。(github地址

话不多说,down下来后看了这哥们的源码,并不复杂,只不过他并没有实现我心中的二级缓存,而是用BitmapLruImageCache和DiskLruImageCache将两个缓存分开,用的时候在ImageCacheManager里设置用哪个缓存。看来还是得自己动手,不一会儿就把它们揉合在一起了,源码如下:

public class LevelTwoCache implements ImageCache {

    private BitmapLruImageCache bitImageCache;

    private DiskLruImageCache diskImageCache;

    public LevelTwoCache(Context context, String uniqueName, int diskCacheSize, int memCacheSize,
            CompressFormat compressFormat, int quality) {

        bitImageCache = new BitmapLruImageCache(memCacheSize);
        diskImageCache = new DiskLruImageCache(context, uniqueName, diskCacheSize, compressFormat,
                quality);

    }

    /**
     * 先从内存获取图片,如果内存找不到就从磁盘里找,找到了存在内存里并返回
     */
    @Override
    public Bitmap getBitmap(String url) {
        String key = createKey(url);
        Bitmap bitmap = null;

        if (bitImageCache.getBitmap(key) == null) {
            if (diskImageCache.containsKey(key)) {
                return null;
            } else {
                bitmap = diskImageCache.getBitmap(key);
                bitImageCache.putBitmap(key, bitmap);
            }
        } else {
            bitmap = bitImageCache.getBitmap(key);
        }

        return bitmap;
    }

    /**
     * 首次图片从网络下载下来后分别保存在内存和磁盘缓存里
     */
    @Override
    public void putBitmap(String url, Bitmap bitmap) {
        String key = createKey(url);

        bitImageCache.putBitmap(key, bitmap);
        diskImageCache.putBitmap(key, bitmap);
    }

    /**
     * 把url转成MD5
     */
    private String createKey(String url) {
        return getBitmapMDKey(url);
    }

    public String getBitmapMDKey(String key) {
        String cacheKey;
        try {
            final MessageDigest mDigest = MessageDigest.getInstance("MD5");
            mDigest.update(key.getBytes());
            cacheKey = bytesToHexString(mDigest.digest());
        } catch (NoSuchAlgorithmException e) {
            cacheKey = String.valueOf(key.h
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值