通过setImageURI将位图分配给ImageView会抛出OutOfMemory异常

时间:2011-08-02 04:39:59

标签: android bitmap imageview uri out-of-memory

我有一个带有空ImageView和按钮的活动。单击按钮后,我显示设备的媒体库,用户选择通过意图传递给活动的图像。我使用返回数据中的图像URI,并填充ImageView,如下所示:

private ImageView pic;

@Override
public void onCreate(Bundle savedInstanceState) 
{

      pic = (ImageView)findViewById(R.id.bbChildImage);

}

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{  

        if(resultCode == RESULT_OK)
        {   
            URI currImageURI = data.getData();
            pic.setImageURI(currImageURI);
        }
}

现在,如果我从图库中选择另一个图像,在返回数据后,我得到一个与位图相关的OutOfMemory异常。

我想出了摆脱它的两种方法。我在分配URI之前执行此操作:

((BitmapDrawable)pic.getDrawable()).getBitmap().recycle();

或者不是将URI分配给视图,而是首先检索位图,然后分配它,如下所示:

Bitmap thumbnail = MediaStore.Images.Media.getBitmap(this.getContentResolver(), currImageURI);
pic.setImageBitmap(thumbnail);

我不确定哪一个更好。此外,如果有更好的方法,我会很感激反馈。

感谢。

1 个答案:

答案 0 :(得分:1)

  1. 回收通常是要走的路。如果您不需要位图,请通过回收来了解操作系统。

  2. 除此之外,我还会使用BitmapFactory创建位图并使用选项在加载时缩小它。不要让它比设备的屏幕大。这将节省大量内存。