图片三级缓存详细整理(一)

一、简介

图片三级缓存问题,我在网上找了很多资料,首先这个功能如果你不深入研究,可以直接下载第三方开源框架Universal-Image-Loader,

我因为处于学习目的,所以没有详细了解Universal-Image-Loader的用法,这里有一个参考的博客,大家如果有需要可以粗略看下(不一定是原创,我因为第一眼看到的是它,所以就推荐过来了,可也可网上自行搜索):http://blog.csdn.net/zenjj11/article/details/38728481

学习图片三级缓存源码的好处:

第一,可以深层次的学习(好牛逼的样子,起码可以出去吹牛),而且人家代码写的好,你看了都不忍心放手,这种感觉真的很赞,当然了,如果实在看不懂别人的代码,看几行就想睡觉,如果还坚持看一定能学到很多,比如我大笑

第二,深层次学习图片三级缓存,我上传的源码是基于gridview控件加载图片的。打个很浅显的比方,如果你项目的布局必须使用listview才能实现,或者里面的item不止一个imageview,那你惨了,必须在网上找个和你项目基本相同的布局才能够拷贝,否则改一下都可能会出现新的问题,但是世界上哪有那么完美的事情。

综上所述--------“没有共产党,就没有新中国”。

二、重要知识点

1.LruCache:缓存工具类。当图片加载出来会放入LruCache中,LruCache为软引用(有的网上注解为硬引用,我去,这个设置size大小,如果超出范围就会自动删减,怎么可能是硬引用),用法如下:


// 最大可用内存及其使用情况
        int maxMemory = (int)Runtime.getRuntime().maxMemory();
        // myLruCache引用缓存容量,为系统分配内存的1/8
        int cacheSize = maxMemory / 8;
        //定义myLruCache
        myLruCache = new LruCache<String, Bitmap>(cacheSize)
        {
            @Override
            protected int sizeOf(String key, Bitmap value)
            {
                if (value != null)
                {
                    return value.getRowBytes() * value.getHeight();
                }
                
                return 0;
                
            }
            
            @Override
            protected void entryRemoved(boolean evicted, String key, Bitmap oldValue, Bitmap newValue)
            {
                if (oldValue != null)
                {
                    // 缓存容量工具类满的时候,相应处理
                   
                }
                
            }
        };

2.SoftReference:内存软引用,当内存空间足够,不会回收;如果内存不足,回收不常用的资源。本项目中是SoftReference和LruCache两个并成为三级缓存的第一级:内存缓存。

LruCache超出范围,则放入SoftReference中。如果SoftReference内存也不够,那么删除不常用的,因为还有第二级:磁盘存储。项目中对SoftReference引用:

mySoftCache = new LinkedHashMap<String, SoftReference<Bitmap>>(softCacheSize, 0.75f, true)
        {
            
            private static final long serialVersionUID = 1L;
            
            @Override
            protected boolean removeEldestEntry(Entry<String, SoftReference<Bitmap>> eldest)
            {
                // 如果HashMap容量大于softCacheSize,那么允许删除容量里面map中最老的键和值,否则不允许删除
                if (size() > softCacheSize)
                {
                    return true;
                }
                return false;
            }
        };

3.DiskLruCache:磁盘存储为第二级存储,当在myLruCache和mySoftCache都找不到图片的时候,会进入磁盘中查找图片信息。磁盘存储是被谷歌认可的技术,但是不是谷歌自己编辑的,所以没有谷歌的API。想了解可以查看另外一个微博:http://blog.csdn.net/fei810711peng/article/details/52795084,网上资料也很多。

4.网络获取图片:这个是图片三级缓存的最后一道防线,如果在磁盘中也找不到,那么只好在网络中获取图片,并且保存到第一级和第二级中。主要使用HttpURLConnection技术,基础问题,可以直接在网上查找相关资料,我整理的代码中也有,方便自己查看。

5.其他细节技术也很重要:ImageDownloadTask(相当于thread和handler结合,即处理线程又能更新ui),主要作用是获取图片,并且更新ui中的图片展示;synchronized(代码块,线程锁),防止出现死锁,程序只能一个一个的进入等。


三级缓存demo下载地址:http://download.csdn.net/detail/fei810711peng/9651974

注:要2个积分的啊~如果你能从网上下载一样可以参考我的注解(那个人的下载地址我忘了,实在抱歉,而且对方没有过多的注释),个人建议在网上找找,找到了在对照这个去理解。



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值