缓存分为:内存缓存+存储设备缓存,在Android中对应:LruCache+DiskLruCache.
首先,LruCache(实现原理为LinkedHashMap)是3.1以后加入的一个api,可以使用v4包兼容至2.2版本。
LruCache(线程安全)内部是一个LinkedHashMap以强引用的方式存储外界的缓存对象。
- 强引用:直接的对象引用。
- 软应用:当一个对象只有软应用存在时,系统内存不足时此对象会被gc回收。
- 弱引用:当一个对象只有弱引用存在时,此对象会随时被回收。
DiskLruCache(创建、缓存添加、缓存查找)
1.创建
使用DisLruCache.open(File directory,inter appVersion,int valueCount,long maxSize)方法
- directory:缓存路径,如果想跟随应用被卸载而删除,请选择/sdcard/Android/data/package_name/cache
- appVersion:版本号,一般填 1,如果升级为2时,缓存会被清除(开发时没必要清除缓存)。
- valueCount:单个节点所对应的数据个数。一般为1。
- maxSize:缓存总大小,注意单位为字节。
2.缓存添加
缓存添加时通过Editor(和sharedPreference相似)完成。
图片缓存:
- 获取图片url所对应的key(采用url的md5值作为key)
- DiskLruCache.Editor editor = DiskLruCache.editor(key);
- OUtputStream outputStream = editor.newOutputStream(DISK_CACHE_INDEX);因为一个节点只有一个数据,故DISK_CACHE_INDEX = 0;
- 通过流将图片写入到文件中
- 调用editor.commit()方法提交写操作。
注意:写入完成后,记得关闭流。
3.缓存查找
- 通过url得到key,通过DiskLruCache.get(key)得到一个Snapshot对象
- 通过Snapshot对象可以得到缓存的输入流,就能得到bitmap了。
注意:这里bitmap要考虑OOM的问题,所以要进行缩放,但是文件输入流因为是优秀的文件流,所以不能两次调用decodeStream(第二次会为null),所以要通过文件流获取文件描述符,然后再通过BitmapFactory.decodeFileDescriptor方法加载缩放后的图片。
网友评论