我的应用程序从 sd 卡解码了很多位图,所以我想重用现有的位图来减少 GC 工作。我看到了来自Android Training和这个视频的例子,它非常适合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 格式的位图。文档说:
The source content must be in jpeg or png format (whether as a resource or as a stream)