Android Studio位图分配内存不足错误

时间:2016-07-25 14:53:00

标签: android bitmap

我使用此功能从相机或图库中旋转位图:

public static Bitmap fixOrientation(Bitmap mBitmap) {

    if (mBitmap.getWidth() > mBitmap.getHeight()) {
        Matrix matrix = new Matrix();
        matrix.postRotate(90);
        return Bitmap.createBitmap(mBitmap , 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix, true); // the error is here!
    }
    return mBitmap;
}

在我使用它的前两次工作正常,但在第三次崩溃应用程序并给我这个错误:

java.lang.OutOfMemoryError: Failed to allocate a 36578316 byte allocation with 16771872 free bytes and 29MB until OOM

这是调用此函数的地方:

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == RESULT_OK && data != null) {

        Uri uri = data.getData();

        try {

            Bitmap sourceBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);

            Bitmap correctBitmap = fixOrientation(sourceBitmap);
            image.setImageBitmap(correctBitmap);

            bitmapsArray[cameraSideInt] = correctBitmap;
            chooseImageLayout.setVisibility(View.GONE);
            // show change layout

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

任何人都可以想办法解决这个错误吗?

1 个答案:

答案 0 :(得分:-1)

是的 - 不要保存那么多位图。您将它们存储在一个数组中。位图占用大量内存。当他们在那个阵列中时,他们不能被垃圾收集,因此内存丢失了。你可能不应该这样做。

您可以在应用中查找其他内存泄漏,它们可能存在,并且可能会节省足够的内存以使其成为可行。但这是一个坏主意,特别是如果位图很大(任何接近全屏的情况)。