Android错误:java.lang.OutOfMemoryError:位图大小超过VM预算

Jib*_*ibW 5 android android-image android-imageview android-memory

我在stackoverflow中遇到了很多关于这个错误的问题,但是他们没有找到解释我的方案的正确解决方案.

在我的Android应用程序中,我必须允许用户单击按钮以打开图库并选择图像.然后需要将特定的选定图像加载到我的布局(UI)中的ImageView.

这样做很好.以下是我用来实现此目的的代码.

在上传按钮中单击 - >

        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent,"Select Picture"), REQUEST_UPLOAD_IMG);
Run Code Online (Sandbox Code Playgroud)

然后onActivityResult - >

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{       
    //super.onActivityResult(requestCode, resultCode, data);        
    if(resultCode == Activity.RESULT_OK)
    {
        if(requestCode==REQUEST_UPLOAD_IMG)
        {               
            Uri selectedImageURI = data.getData();
            uploadImgVW.setImageURI(selectedImageURI);              
        }
        else
        {
            Toast.makeText(MainActivity.this, "You can only select an Image.", Toast.LENGTH_LONG).show();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果用户选择具有更大尺寸的图像(如2MB大小),应用程序将退出并出现以下错误.但是正常(KB级别)图像非常好,并且想知道我能为此问题做些什么(处理这种错误情况).谢谢...

错误 - >

06-20 16:43:58.445: E/AndroidRuntime(2075): FATAL EXCEPTION: main
06-20 16:43:58.445: E/AndroidRuntime(2075): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
Run Code Online (Sandbox Code Playgroud)

gun*_*nar 7

有一系列文章描述了如何有效地管理位图.查看您的代码,您加载图像时不知道它有多大,最终您将面临这些问题,尤其是在加载和处理许多图像时.

其中一篇文章中描述的想法是加载已经缩小的位图(首先你要检查要加载的图像有多大,然后你计算缩小的因子,然后你才会加载缩放的向下图像) .为此,您首先需要知道ImageView的尺寸,然后您必须使用BitmapFactory.decode(...),因为您要显示目标文件的Uri.Uri要归档应该是微不足道的.

此外,您还需要检查应用程序的内存消耗情况......您可能还有其他资源挂在内存中,您需要清理它们.我正在使用一个非常有用的工具 - MAT.这里有一篇非常好的文章可以在这里找到.作者Patrick Dubroy在Google IO 2011上就此主题举行了一次非常有趣的会议.检查一下,对我来说这非常有帮助......