内存缓存和硬盘缓存

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012259618/article/details/52280860

由于工作中经常要处理图片的加载缓存的问题,所以需要理清系统缓存的问题,否则经常会出现OOM问题。防止多图OOM的解决技术是使用LruCache和DiskLruCache两种技术。

一 LruCache内存缓存

在Android中,这个LruCache类专门用做图片缓存处理的。当缓存的图片达到预先设置的值得时候,那么近期使用次数最少的图片就会被回收掉。

有些人可能还会使用软引用这种方式。所谓“软引用”就是只要有足够的内存,就一直保持对象,知道发现内存吃紧且没有Strong Ref时才回收对象。但是现在已经不再推荐使用这种方式了,因为从Android2.3开始,垃圾回收器会更倾向于回收持有软引用或弱引用的对象,这让软引用和弱引用变得更加不可靠。另外,Android3.0中,图片的数据会存储在本地的内存中,因而无法用一种可预见的方式将其释放,这就有潜在的风险造成应用程序的内存溢出并奔溃。

如何使用LruCache呢?可以参考http://blog.csdn.net/gf771115/article/details/30269159文档。

二 DiskLruCache硬盘缓存

LruCache只是管理了内存中图片的存储与释放,如果图片从内存中被移除,那么又要重新加载一次图片,这样就会非常耗时。对此,google又提供了一套硬盘缓存的方案——disklrucache。

在我们经常看到的应用,例如网易新闻、Twitter等,都是使用这种技术。可以查看客户端的包名,找到缓存地址,

会发现有一个名字为journal的文件,这个文件时disklrucache的一个日志文件,看到这个文件就说明改程序使用了这种技术。disklrucache中使用了一个redundantopcount变量来记录用户的操作次数,没执行一次写入、读取或移除缓存的操作,这个变量值都会加1,当变量值达到2000的时候就会触发重构journal的事件,这是会自动把journal中的一些多余的、不必要的记录全部清除掉,保证journal文件大小始终保持在一个合理的范围内。

下载地址:android.googlesource.com/platform/libcore/+/jb-mr2-release/luni/src/main/java/libcore/io/DiskLruCache.java

下载好了源码之后,只需要在项目中新建一个libcore.io包,然后将DiskLruCache.Java文件复制到这个包中即可。

参考文档:http://blog.csdn.net/lwyygydx/article/details/40401211

猜你喜欢

转载自blog.csdn.net/u012259618/article/details/52280860
今日推荐