【问题标题】:Out of memory error while loading an Image in ImageView在 ImageView 中加载图像时出现内存不足错误
【发布时间】:2014-01-11 09:45:32
【问题描述】:

我知道它在这里被问了很多次,我经历了很多答案,但没有理解1个想法。

我正在尝试在 ImageView

中显示 .jpg 图像
<ImageView
    android:id="@+id/bg"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:adjustViewBounds="true"
    android:scaleType="centerCrop"
    android:src="@drawable/bg" />

bg.jpg650 k.b in size with 1600 x 1700 WxH resolution placed in drawable folder

我在少数设备上遇到内存不足错误。

我的印象是内存大小很重要,而 650 k.b 并不多。但是当我读到Displaying Bitmaps EfficientlyLoading Large Bitmaps Efficiently 时:看起来分辨率才是最重要的。如果根据这些页面配置为 ARGB_8888,我的图像将占用 1600 x 1700 x 4 字节,即超过 10 m.b

所以,

  1. 即使 10 m.b 小于每个应用程序的 16 m.b 限制,为什么它会给我这个错误?

  2. 如上述链接中所述,如果我缩小图像,有些设备的分辨率为 1200 x 2000 WxH,而我将无法进行缩放,因此会出现相同的错误。

我看到应用程序加载了多个全屏图像(可滚动),而我只使用了 1 个 :(

我错过了什么?

【问题讨论】:

  • 试试这个,只需在清单文件中添加 android:largeHeap="true" this 来增加堆内存。也许它会起作用,我不确定天气会不会起作用。但这只是您可以尝试的一种解决方案。
  • 即使有效,我也不想按照here的解释使用这个解决方案@
  • 厌倦了所有 largeHeap 答案,这些答案总是 OOM 问题中的第一个答案,这只是隐藏症状,而不是治愈它们!

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


【解决方案1】:

首先,每个应用的堆限制因设备而异,并不总是设置为 16 MB。您的堆将包含各种对象,例如您的活动、片段、视图和您自己初始化的其他对象。

所以计算并不像16 -10 = 6 MB那么简单。

如果您想了解有关内存分析的更多信息,请尝试此post

其次,1600 x 1700 分辨率的图像对于大多数 Android 设备屏幕来说太大了。这正是 android 具有资源限定符的原因,以便您可以为不同的屏幕分辨率提供图像的缩小版本。 See docs for more on this.

如果您担心在不同分辨率下保持图像的纵横比,您可以简单地将ImageView.ScaleType 属性设置为 CENTER_INSIDE。

【讨论】:

  • 如果我使用了资源限定符,我最终会使用更大的图像。因为到目前为止我只考虑mdpi 并将图像保存在可绘制文件夹中,如果我考虑hdpi or xhdpi 我可能不得不使用1.5x 2x image size
  • 对 xxxhdpi 使用您现在拥有的尺寸并为其他尺寸缩小。
  • 如果有一个带有1000 x 1000 and xhdpi的设备,并且我希望图像全屏显示,那么我必须放置一个2000 x 2000 sized image in xhdpi folder对吗?
  • 您可以将任何尺寸的图像放在您想要的任何可绘制文件夹中,Android 会为您缩放。唯一的问题是,如果您提供正确的资源集,它们会看起来更好。我建议详细阅读开发人员文档以了解资源选择的工作原理:developer.android.com/guide/practices/screens_support.html
【解决方案2】:

使用这个Bitmap.createScaledBitmap(src, dstWidth, dstHeight, filter)

这里 dstWidth 和 dstHeight 是 int 变量。

【讨论】:

  • 但在更大的屏幕上,dstWidthdstHeight 将与实际图像大小相同。即使在努力缩小规模后,这也会导致同样的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 2011-06-18
相关资源
最近更新 更多