【问题标题】:Assigning bitmap to ImageView via setImageURI throws OutOfMemory exception通过 setImageURI 将位图分配给 ImageView 会引发 OutOfMemory 异常
【发布时间】:2011-08-02 04:39:59
【问题描述】:

我有一个带有空 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 到 3 兆之间,具体取决于设备。
  • 你的第一种方法更好
  • @ingsaurabh,你能解释一下原因吗?
  • 因为在第二种方法中你没有释放内存,所以迟早你会再次得到 OOM 它总是一个好主意,一旦你完成了回收位图以获取更多信息,请查看@987654321 @

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


【解决方案1】:
  1. 回收通常是要走的路。如果不需要位图,可以通过回收让操作系统知道。

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

【讨论】:

  • 如果意图发回 URI,我将如何使用 BitmapFactory 制作位图?
  • 这里有一些例子:stackoverflow.com/questions/3879992/…
  • 另外,我可以这样做仅用于显示目的,但我仍然需要完整的位图,因为我需要通过网络服务上传它
猜你喜欢
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
相关资源
最近更新 更多