在ImageView中加载图像时出现内存不足错误

时间:2013-12-23 07:40:19

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

我知道它在这里多次问过,我已经经历了很多答案,但是没想到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.jpg 650 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,我将无法进行缩放,因此我得到相同的错误。

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

    我错过了什么?

2 个答案:

答案 0 :(得分:0)

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

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

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

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

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

答案 1 :(得分:0)

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

这里dstWidth和dstHeight是int变量。