您的位置:首页 > 移动开发 > Android开发

android的三级缓存

2016-07-07 21:04 423 查看
三级缓存策略:

缓存的好处:

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);

            }

        }

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: