图片三级缓存的流程
三级缓存的内容:
1. 从内存中获取图片,有,加载显示
2. 如果内存中没有,从本地获取图片,有加载显示,并且将图片缓存到内存,为下一次显示准备
3. 如果本地也没有,从网络下载图片,下载完成,显示图片,通过缓存到内存,保存到本地文件中,为下一次显示准备
在内存中获取图片有两种方式
第一种:软引用的方式(不太常用了)
强引用: user = new UserInfo(), 不会轻易被系统回收
软引用: SoftReference<Bitmap>, 当内存不足的时候,系统会回收软引用
弱引用: WeakReference<Bitmap>, 当内存不足的时候,系统会回收弱引用,如果软引用和弱引用同时存在,先回收弱引用
虚引用: PhantomReference<Bitmap>, 当内存不足的时候,系统会回收弱引用,优先级低于弱引用
第二种:LruCache方式
判断最新一段时间内的图片引用的次数,判断是否需要缓存,将使用频率比较高的音乐缓存到内存中去
1、创建LruCache对象
public MyCacheBitmapUtils(){
//map = new HashMap<String, SoftReference<Bitmap>>();
//maxSize : 缓存空间大小,一般是总内存的 8 分之一
int maxSize = (int) (Runtime.getRuntime().totalMemory()/8);
lruCache = new LruCache<String, Bitmap>(maxSize){
// 获取缓存图片的 大小
@Override
protected int sizeOf(String key, Bitmap value) {
//value.getRowBytes() : 获取图片一行占用的字节数
return value.getRowBytes() * value.getHeight();
}
};
}
2、缓存图片
public void saveBitmap(String url,Bitmap bitmap){
//SoftReference<Bitmap> softReference = new SoftReference<Bitmap>(bitmap);// 使用软引用修改 bitmap 引用
//map.put(url, softReference);
lruCache.put(url, bitmap);
}
3、获取缓存图片
public Bitmap getBitmap(String url){
/*SoftReference<Bitmap> softReference = map.get(url);
// 确认软引用没有被回收
if (softReference != null) {
Bitmap bitmap = softReference.get();
return bitmap;
}*/
Bitmap bitmap = lruCache.get(url);
return bitmap;
}
4、将上面三步放到一个工具类中 通过工具类调用
本地缓存
通过IO流操作 保存和读取文件
1、保存图片
File file = new File(dr, MD5Util.Md5(url).substring(0, 10));
FileOutputStream stream = new FileOutputStream(file);
// 设置图片类型质量,将图片保存本地文件中
// 参数 1 :图片格式
// 参数 2 :图片的质量
// 参数 3 :写入流
bitmap.compress(CompressFormat.JPEG, 100, stream);
2、获取图片
File file = new File(PATH, MD5Util.Md5(url).substring(0, 10));
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
return bitmap;
网络获取
URL mUrl = new URL(url);
HttpURLConnection con = (HttpURLConnection) mUrl.openConnection();
con.setConnectTimeout(5000);// 设置链接超时时间
con.setReadTimeout(5000);// 设置读取超时时间
con.connect();// 链接网络操作
int code = con.getResponseCode();// 获取服务器响应码
if (code == 200) {
// 获取服务器数据,以流的形式返回
InputStream stream = con.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(stream);
return bitmap;
}
此处采用HttpURLConnection进行网络操作