第6天Bitmap三级缓存+二次采样
Bitmap三级缓存
一.为什么Bitmap三级缓存?
二.原理
三.代码
Bitmap二次采样
一.为什么二次采样
二.哪二次采样
三.代码:网络请求图片进行尺寸压缩
Bitmap的质量压缩
1.方法介绍
2.案例:将一张Bitmap图片采用50%质量压缩到SD卡中
Bitmap三级缓存
一.为什么Bitmap三级缓存?
没有缓存的弊端 :费流量, 加载速度慢
加入缓存的优点: 省流量,支持离线浏览
二.原理
思路:
从内存获取图片, 如果存在, 则显示; 如果不存在, 则从SD卡中获取图片
从SD卡中获取图片, 如果文件中存在, 显示, 并且添加到内存中; 否则开启网络下载图片
从网络下载图片, 如果下载成功, 则添加到缓存中, 存入SD卡, 显示图片
三.代码
(1)添加读写SD卡的权限和网络权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>!![在这里插入图片描述](https://img-blog.csdnimg.cn/20190612213005512.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpemh1YW5nXzY2Ng==,size_16,color_FFFFFF,t_70)
(2)操作内存工具类:提供从内存中读写的方法,内存不能持久保存,可能过一会就会被回收掉
//Lrucache存储工具类
public class LruUtils {
//TODO 1:实例化LruCache对象
private LruCache<String,Bitmap> lruCache;
private long max=Runtime.getRuntime().maxMemory();//获得手机的最大内存
public LruUtils(){
lruCache=new LruCache<String,Bitmap>((int)max/8){//给内存大小,一般是最大内存的1/8
//重写该方法返回每个对象的大小
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getByteCount();
}
};
}
//TODO 2:读图片
public Bitmap getBitmap(String key){
return lruCache.get(key);
}
//TODO 3:存图片
public void setBitmap(String key,Bitmap bitmap){
lruCache.put(key,bitmap);
}
}
(3)操作SD卡工具类:提供从SD卡中读写的方法
//TODO 读图片和写图片
public class SDUtils {
//TODO 1:存图片:bitmap.compress()
public static void setBitmap(String name,Bitmap bi