缓存策略在Android有着广泛的使用场景.
目前比较常用的缓存算法是LRU(Least Recently Used):近期最少使用算法.
核心思想 : 当缓存满时,会优先淘汰近期最少使用的缓存对象.
采用LRU算法的缓存有两种:(LruCache和DiskLruCache)
一 . LruCache : 用于实现内存缓存.
LruCache是一个泛型类,并且LruCache是线程安全的:他的内部采用一个LinkedHashMap以强引用的方式存储外界的缓存对象,其提供了put函数和get函数来完成缓存的存储和获取.当缓存满时,LruCache会采用LRU算法来移除近期最少使用的缓存对象然后再添加新的缓存对象.
------------------------------------------------------------------------------------------------------------------
强引用,软引用和弱引用的区别如下所示:
强引用 : (String str = “abc”; list.add(str); )
如果一个对象具有强引用,那就类似于必不可少的生活用品。
垃圾回收器绝不会回收它.当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题. 并且list集合中的内容即使在内存不足的情况下也不会释放.
软引用 :
如果一个对象只具有软引用,那就类似于可有可物的生活用品。
如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。
软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,JAVA虚拟机就会把这个软引用加入到与之关联的引用队列中。
弱引用:
如果一个对象只具有弱引用,那就类似于可有可物的生活用品。
弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。
弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
如果弱引用对象回收完之后,内存还是报警,继续回收软引用对象
如果虚引用对象回收完之后,内存还是报警,继续回收弱引用对象
请遵循如下规则:
提供总容量的大小.
实例化LruCache时需要重写sizeOf方法即可.也可以贴贴源码.
Runtime.getRuntime().maxMemory():
//应用程序最大可用内存
int maxMemory = ((int) Runtime.getRuntime().maxMemory())/1024/1024;
//应用程序已获得内存
long totalMemory = ((int) Runtime.getRuntime().totalMemory())/1024/1024;
//应用程序已获得内存中未使用内存
long freeMemory = ((int) Runtime.getRuntime().freeMemory())/1024/1024;
System.out.println("---> maxMemory="+maxMemory+"M,totalMemory="+totalMemory+"M,freeMemory="+freeMemory+"M");
二 . DiskLruCache : 用于实现存储设备缓存.
DiskLruCache用于实现存储设备缓存,即磁盘缓存(通过将缓存对象写入文件系统,从而实现缓存的效果).
DiskLruCache不能通过构造方法来创建,他可以通过open(File directory, int appVersion, int valueCount , long maxSize)来创建.
参数一 : File directory(磁盘缓存在文件系统中的存储路径)
大写的PS : 缓存路径可以选择SD卡上的缓存目录. /sdcard/Android/data/package_name/cache目录.其中package_name表示当前的包名.好处就是当应用被卸载时此目录会一并删除.当然也可以选择SD卡上的其他目录.这样在应用被删除时此目录下的缓存文件不会被删除.具体遵循您的需求而定.
参数二 : int appVersion(应用的版本号,一般设置为1即可)
大写的PS : 理论上讲当版本号发生改变时DiskLruCache会清空之前所有的缓存文件,但在实际开发中则不然,没有卵用.
参数三 : int valueCount(单个节点所对应的数据的个数,一般设置为1即可)
参数四 : long maxSize(缓存的总大小)
大写的PS : 例如设置缓存的总大小为66MB,当缓存数据文件大小超出这个值时,DiskLruCache会根据最近最少使用算法清除一些缓存从而保证总大小不大于这个您设定好的缓存值.