Bitmap三级缓存
一.为什么使用Bitmap三级缓存?
1.没有缓存的弊端:费流量,加载速度慢
2.加入缓存的优点:省流量,支持离线浏览
二.原理
思路:
1.从内存获取图片,如果存在,则显示;如果不存在,则从SD卡中获取图片
2.从SD卡中获取图片,如果文件中存在,显示,并且添加到内存中,否则开启网络下载图片
三.代码
(1).添加读写SD卡的权限和网络权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
(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 bitmap){
//获取路径存储图片
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File file=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File file1=new File(file,name);
//存储图片:bitmap对象---->SD卡
try {
//参数一 图片的格式 参数二 图片质量 0-100 参数三:输出流
bitmap.compress(Bitmap.CompressFormat.JPEG,100,new FileOutputStream(file1));
} catch (FileNotFoundException e) {
e.printStackTrace