重用BitmapFactory.decodeFile和BitmapFactory.Options.inBitmap的位图

时间:2013-08-23 22:34:14

标签: android bitmap

我的应用从SD卡解码了很多位图,所以我想重用现有的位图来减少GC工作。我看到了来自Android Trainingthis video的示例,它适用于BitmapFactory.decodeResource,但不适用于BitmapFactory.decodeFile。我使用下一个代码:

private void testBitmapReusing() {
        BitmapFactory.Options options = newOptions();
        Bitmap bitmap = decode(options);

        options.inBitmap = bitmap;
        bitmap = decode(options);
    }

    private BitmapFactory.Options newOptions() {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 1;
        options.inMutable = true;
        return options;
    }

    private Bitmap decode(BitmapFactory.Options options) {
        return  BitmapFactory.decodeFile("/mnt/sdcard/sun.jpg", options);
        //  return BitmapFactory.decodeResource(getResources(), R.drawable.sun, options);
    }

注释代码(BitmapFactory.decodeResource)按预期工作,它使用现有位图解码新位图。但是未注释的代码(BitmapFactory.decodeFile)不会解码新的位图。它只是写入日志消息“E / BitmapFactory:无法解码流:java.lang.IllegalArgumentException:解码到现有位图的问题”

那我的错误在哪里?

更新 我意识到我的失败。我尝试解码GIF图像,但不可能重用GIF格式的位图。 docs says

The source content must be in jpeg or png format (whether as a resource or as a stream)

1 个答案:

答案 0 :(得分:0)

它可能不是你正在寻找的东西,但另一种方法是创建一个Map(例如HashMap),并在它们被调用后立即添加资源。像这样:

HashMap<String, Bitmap> map = new HashMap<String, Bitmap>();

public Bitmap loadBitmap(String location) {
    if (map.containsKey(location))
        return map.get(location);

    Bitmap bmp = yourDecodeMethod(location);
    map.put(location, bmp);

    return bmp;
}

这与我每次不想重新加载资源时使用的方法相同。对不起,如果这不是您想要做的,我尽力了解您的实际目标:)

祝你好运!