三级缓存策略:
缓存的好处:
1. 服务器的压力大大减小;
2. 客户端的响应速度大大变快(用户体验好);
3. 客户端的数据加载出错情况大大较少,大大提高了应有的稳定性(用户体验好);
思路:
1、先从内存缓存中获取,取到则返回,取不到则进行下一步;
2、从文件缓存中获取,取到则返回并更新到内存缓存,取不到则进行下一步;
3、从网络下载图片,并更新到内存缓存和文件缓存。
具体说就是:
同一张图片只要从网络获取一次,然后在本地缓存起来,之后加载同一张图片时就从缓存中去加载。从内存缓存读取图片是最快的,但是因为内存容量有限,所以最好再加上文件缓存。文件缓存空间也不是无限大的,容量越大读取效率越低,因此可以设置一个限定大小比如10M
Lru 最近最少使用算法
LruCache<K,V> 在内存中存放Bitmap的类
部分代码:
// 图片处理管理类
public class LruCacheUtil {
private LruCache<String, Bitmap> cache;
private Context mContext;
private ImageCallBack callBack;
// 回调接口 更新图片
public interface ImageCallBack {
public void updateImage(Bitmap bimap, String key);
}
public LruCacheUtil(Context mContext, ImageCallBack callBack) {
super();
this.mContext = mContext;
this.callBack = callBack;
// 获取系统最大的内存空间大小 取 1/8 作为 当前缓存空间
long maxMemory = Runtime.getRuntime().maxMemory();
int maxSize = (int) (maxMemory / 8);
// LruCache 实例化 参数 为 分配空间的大小
cache = new LruCache<String, Bitmap>(maxSize) {
// 修改返回值 返回当前Bitmap的大小 而不是 数量
@Override
protected int sizeOf(String key, Bitmap value) {
// TODO Auto-generated method stub
return value.getByteCount();
}
};
}
// 获取图片的方法 所有需要用到图片的地方必须通过该方法获取Bitmap
// 三级缓存策略 从内存中取 如果没有 取SD卡中取 如果没有 去网络下载
public Bitmap getBitmap(String key) {
Bitmap bitmap = cache.get(key);
if (bitmap == null) {
bitmap = SDcardUtil.getBitmapFromSD(key, mContext);
if (bitmap == null) {
new DownLoadBitmapTask().execute(key);
} else {
// 如果内存中没有Sd 卡中有则取出来 存到内存中
cache.put(key, bitmap);
}
}
return bitmap;
}
// 下载图片
class DownLoadBitmapTask extends AsyncTask<String, Void, Bitmap> {
String image_url;
@Override
protected Bitmap doInBackground(String... params) {
image_url = params[0];
Bitmap map = HttpUtil.getBitmapFromNet(image_url);
return map;
}
@Override
protected void onPostExecute(Bitmap result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
// TODO 1 将这个图片存到SD卡 2 将这个图片存在 缓存中 3 更新到UI
if (result != null) {
// 保存到SD卡
SDcardUtil.saveBitmapToSD(image_url, result, mContext);
// 保存到缓存中
cache.put(image_url, result);
// 更新UI
callBack.updateImage(result, image_url);
}
}
}
}