一、简介
图片三级缓存问题,我在网上找了很多资料,首先这个功能如果你不深入研究,可以直接下载第三方开源框架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个积分的啊~如果你能从网上下载一样可以参考我的注解(那个人的下载地址我忘了,实在抱歉,而且对方没有过多的注释),个人建议在网上找找,找到了在对照这个去理解。