android的三级缓存


三级缓存策略:
缓存的好处:
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);

            }
        }

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值