现在的位置: 首页 > 综合 > 正文

Android Bitmap的缓存实现再也不怕ListView多图 oom了

2014年05月07日 ⁄ 综合 ⁄ 共 1093字 ⁄ 字号 评论关闭

一般网上Bitmap的缓存方法都是采用软引用的方式,其实还有更好的方法,这也是Google官方推荐的方法。废话不说,放代码。

import android.graphics.Bitmap;
import android.support.v4.util.LruCache;

/**
 * Created by Cying on 14-2-21.
 */
public class BitmapCache {

    public static BitmapCache instance;

    public static BitmapCache getInstance() {
        if (instance == null) {
            instance = new BitmapCache();
        }
        return instance;
    }

    private LruCache<String, Bitmap> mImageCache;

    private BitmapCache() {
        // 获取到可用内存的最大值,使用内存超出这个值会引起OutOfMemory异常。
        // LruCache通过构造函数传入缓存值,以KB为单位。
        int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
        // 使用最大可用内存值的1/8作为缓存的大小。
        int cacheSize = maxMemory / 8;
        mImageCache = new LruCache<String, Bitmap>(cacheSize) {
            @Override
            protected int sizeOf(String key, Bitmap bitmap) {
                // 重写此方法来衡量每张图片的大小,默认返回图片数量。
                return   ImageHelper.getByteCount(bitmap) / 1024;
            }
        };
    }

    public void addBitmapToCache(String path, Bitmap bitmap) {

        if(getBitmapByPath(path)!=null)
        {
            mImageCache.remove(path);
        }
        mImageCache.put(path, bitmap);


    }

    public Bitmap getBitmapByPath(String path) {

        return mImageCache.get(path);
    }


    public void removeBitmap(String path)
    {
        Bitmap bitmap=getBitmapByPath(path);
        if(bitmap!=null&&!bitmap.isRecycled())
        {
            bitmap.recycle();
        }
        mImageCache.remove(path);
    }


}

抱歉!评论已关闭.