Java OutOfMemory使用inJustDecodeBounds对图像进行解码=true

Java OutOfMemory使用inJustDecodeBounds对图像进行解码=true,java,android,image,android-camera,out-of-memory,Java,Android,Image,Android Camera,Out Of Memory,在我的Android应用程序中,我不断地尝试解码来自摄像头的图像,以避免记忆异常。有很多问题都在处理这个问题,但我的情况特别奇怪,因为即使只是尝试使用选项获取边界,我也会遇到异常。inJustDecodeBounds=true 以下是启动相机的代码: protected void takePicture() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File image =

在我的Android应用程序中,我不断地尝试解码来自摄像头的图像,以避免记忆异常。有很多问题都在处理这个问题,但我的情况特别奇怪,因为即使只是尝试使用
选项获取边界,我也会遇到异常。inJustDecodeBounds=true

以下是启动相机的代码:

protected void takePicture() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    File image = new File(IMAGE_PATH, "camera.jpg");
    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image));
    startActivityForResult(takePictureIntent, 0);
}
以下是触发异常的代码:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK ) { 
        String rawImageName = new String(IMAGE_PATH + "/camera.jpg");

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(rawImageName); // The exception is thrown here
            .
            .
            .
    }
}
options.inSampleSize = 20;
options.inJustDecodeBounds = false;
options.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap photo = BitmapFactory.decodeFile(rawImageName); // Again the exception
我尝试使用非常高的采样率对图像进行解码,但仍然得到相同的异常:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK ) { 
        String rawImageName = new String(IMAGE_PATH + "/camera.jpg");

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(rawImageName); // The exception is thrown here
            .
            .
            .
    }
}
options.inSampleSize = 20;
options.inJustDecodeBounds = false;
options.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap photo = BitmapFactory.decodeFile(rawImageName); // Again the exception

除此之外,应用程序似乎运行正常,并且有足够的可用内存。我可以在gallery应用程序中正确打开图像。将映像移动到其他目录没有帮助。知道是什么引起的吗?使用
inJustDecodeBounds=true进行解码时,什么可能导致异常?

您需要将选项传递给解码调用:

BitmapFactory.decodeFile(rawImageName, options);

您需要将选项传递给解码调用:

BitmapFactory.decodeFile(rawImageName, options);
试试这个。使用后还可以调整图像大小并使位图对象为空。 调用
System.gc()它不调用gc,但给出提示。
也不要制作很多位图对象。重复使用同一位图对象,并在使用后使其为空

试试这个。使用后还可以调整图像大小并使位图对象为空。 调用
System.gc()它不调用gc,但给出提示。

也不要制作很多位图对象。重复使用同一位图对象,并在使用后将其设为空。

向我们展示您的stacktrace。我认为您应该查看此链接:嗯,这恰好是一个愚蠢的复制粘贴错误。是否应删除该问题?它对其他人有什么价值吗?给我们看看你的stacktrace。我想你应该看看这个链接:嗯,这恰好是一个愚蠢的复制粘贴错误。是否应删除该问题?它对其他人有价值吗?哦,我的愚蠢!!!这就是复制粘贴代码时发生的情况。把我的头发拔了好几个小时!!!哦,我的愚蠢!!!这就是复制粘贴代码时发生的情况。把我的头发拔了好几个小时!!!而是在位图上使用recycle()而不是gc。GC可能不会立即释放内存。看,是的,你是对的。如果不再使用位图对象,请回收它们。调用System.gc()实际上是一种应该避免的反模式。你可以在网上找到很多关于这个的文档。总而言之,它高喊“坏代码”,它不保证做任何事情,它可能会减慢代码的速度,因为您可能会开始一个完整的GC周期。始终避免使用System.gc()。而是在位图上使用recycle(),而不是gc。GC可能不会立即释放内存。看,是的,你是对的。如果不再使用位图对象,请回收它们。调用System.gc()实际上是一种应该避免的反模式。你可以在网上找到很多关于这个的文档。总而言之,它高喊“坏代码”,它不保证做任何事情,它可能会减慢代码的速度,因为您可能会开始一个完整的GC周期。始终避免使用System.gc()。