关于Android开发中图片的三级缓存机制
2015-08-08 08:55
225 查看
1.Android应用中联网加载并显示图片时,为了用户体验和节省流量,一定用到图片的缓存。
2.关于三级缓存的理解:内存缓存(强引用存储)、内存缓存(软引用缓存)、内存缓存(弱引用缓存)、文件缓存(就是将图片存储为本地文件),由此组成三级缓存。
3.关于JAVA中的对象引用,分为:强、软、弱、虚。
4.关于JAVA的强引用与软引用:
(1)强引用:JVM不会回收任何具有强引用的对象,内存空间不足时,将抛出OOM异常;
(2)软引用:在内存不足时,JVM将会回收掉具有软引用的对象,从而满足程序运行的需求,以此避免出现OOM导致的程序崩溃。
5.关于LruCache类的理解:
这个类其实就是一个哈希表,存储键值对。
值得注意的是:LruCache内部存储的图片内存数量超过上限以后,将采用LRU算法删除部分图片。LRU:Least-Recently-Used,最近最少使用算法。
Cache保存一个强引用来限制内容数量,每当Item被访问的时候,此Item就会移动到队列的头部。当cache已满的时候加入新的item时,在队列尾部的item会被回收。
6.内存缓存部分:
(1)强引用存储区:
LruCache<String,Bitmap> cache = new LruCache<String,Bitmap>();
(2)软引用存储区:
HashMap<String,Bitmap> softBitmapCache = new HashMap<String,SoftReference<Bitmap>>();
7.文件缓存部分:
(1)获取本地存储的文件名:采用MD5算法,建立URL与文件名的唯一映射关系。将从网络下载的图片文件,存储为本地文件,命名为MD5转换的文件名。
(2)获取本地存储的路径:优先存储SD卡外部存储,找不到存储卡时,可以存储到内部存储。
8.从文件缓存中获取图片的流程:
强引用存储区---->软引用存储区---->文件存储----->网络获取---->显示UI
9.问题:在内存缓存中获取图片时,为什么先在强引用存储区查找,再去软引用存储区查找?
答:强引用存储区存储的图片,有上限,超过上限将会采用LRU算法进行删除;软引用存储区的图片,在内存不足时,JVM将会自动删除部分图片。
10.不同的API级别,计算Bitmap对象的内存占用大小的代码示例:
11.在内存缓存中取出Bitmap对象代码示例:
12.第一次获取在网上获取图片文件时,存入三级缓存中的代码示例:
2.关于三级缓存的理解:内存缓存(强引用存储)、内存缓存(软引用缓存)、内存缓存(弱引用缓存)、文件缓存(就是将图片存储为本地文件),由此组成三级缓存。
3.关于JAVA中的对象引用,分为:强、软、弱、虚。
4.关于JAVA的强引用与软引用:
(1)强引用:JVM不会回收任何具有强引用的对象,内存空间不足时,将抛出OOM异常;
(2)软引用:在内存不足时,JVM将会回收掉具有软引用的对象,从而满足程序运行的需求,以此避免出现OOM导致的程序崩溃。
5.关于LruCache类的理解:
这个类其实就是一个哈希表,存储键值对。
值得注意的是:LruCache内部存储的图片内存数量超过上限以后,将采用LRU算法删除部分图片。LRU:Least-Recently-Used,最近最少使用算法。
Cache保存一个强引用来限制内容数量,每当Item被访问的时候,此Item就会移动到队列的头部。当cache已满的时候加入新的item时,在队列尾部的item会被回收。
6.内存缓存部分:
(1)强引用存储区:
LruCache<String,Bitmap> cache = new LruCache<String,Bitmap>();
(2)软引用存储区:
HashMap<String,Bitmap> softBitmapCache = new HashMap<String,SoftReference<Bitmap>>();
7.文件缓存部分:
(1)获取本地存储的文件名:采用MD5算法,建立URL与文件名的唯一映射关系。将从网络下载的图片文件,存储为本地文件,命名为MD5转换的文件名。
(2)获取本地存储的路径:优先存储SD卡外部存储,找不到存储卡时,可以存储到内部存储。
8.从文件缓存中获取图片的流程:
强引用存储区---->软引用存储区---->文件存储----->网络获取---->显示UI
9.问题:在内存缓存中获取图片时,为什么先在强引用存储区查找,再去软引用存储区查找?
答:强引用存储区存储的图片,有上限,超过上限将会采用LRU算法进行删除;软引用存储区的图片,在内存不足时,JVM将会自动删除部分图片。
10.不同的API级别,计算Bitmap对象的内存占用大小的代码示例:
11.在内存缓存中取出Bitmap对象代码示例:
12.第一次获取在网上获取图片文件时,存入三级缓存中的代码示例:
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories