Android - 如何使用位图避免内存过载?

时间:2011-02-09 15:10:40

标签: android image bitmap photo

我的应用程序正在使用位图,每次用户进入特定活动时,它会在第二次停止工作时显示图像。

Bitmap bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"//Pics/"Image.jpg");

我尝试过使用像......这样的东西。

BitmapFactory.Options options = new BitmapFactory.Options();
     options.inTempStorage = new byte[16*1024];

不确定要设置什么。但这没有帮助。一旦用户离开此活动,是否有办法清除位图等?感谢

3 个答案:

答案 0 :(得分:8)

完成使用位图释放内存后调用Bitmap.recycle()

答案 1 :(得分:8)

除了按照建议使用Bitmap.recycle()之外(这不适合所有情况而且颈部疼痛要问:“我还需要这个位图吗?”),I总是使用这种非常好的技术:

// 1. create a cache map
private WeakHashMap<String, SoftReference<Bitmap>> mCache;

如您所见,它是WeakReference的散列图,其中SoftReference为值。

//2. when you need a bitmap, ask for it:
public Bitmap get(String key){
    if( key == null ){
        return null;
    }
    if( mCache.containsKey(key) ){
        SoftReference<Bitmap> reference = mCache.get(key);
        Bitmap bitmap = reference.get();
        if( bitmap != null ){
            return bitmap;
        }
        return decodeFile(key);
    }
    // the key does not exists so it could be that the
    // file is not downloaded or decoded yet...
    File file = new File(Environment.getExternalStorageDirectory(), key);
    if( file.exists() ){
        return decodeFile(key);
    } else{
        throw new RuntimeException("Boooom!");
    }
}

这将检查缓存映射。如果文件已经解码,则会返回;否则它将被解码和缓存。

//3. the decode file will look like this in your case
private Bitmap decodeFile(String key) {
    Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"//Pics/"+key);
    mCache.put(key, new SoftReference<Bitmap>(bitmap));
    return bitmap;
}

使用软引用很好,因为您将位图从内存中删除的责任转移到操作系统。

答案 2 :(得分:1)

请注意。 当我们考虑软引用时,我们认为操作系统会在报告outofmemory异常之前从memrory中删除softreferenced对象。

在android中,这并非总是如此。我必须为图像实现自己的缓存系统,我可以向你保证,当内存几乎已满时,软件引用的对象不会从内存中删除。

最后我不得不切换到硬引用(正常引用),但使用android.support.v4.util.LruCache来管理缓存对象。我会在lru缓存的onRemoved回调上调用recycle。它的定义更方便。

干杯。