0

我们正在开发一个大量使用图像(大小)的 Android 应用程序。我们的主屏幕有图像的“拼贴”。我们已经通过通常的机制调试了一系列“内存泄漏” ......但刚刚注意到我们setContentView在 main中的调用Activity导致了非常大的内存分配:

08-14 15:27:30.688: D/BEFORE setContentView PJK 6 CollageActivity(21845): debug.memory: 分配: 49.05MB of 192.00MB (19.22MB free)
08-14 15:27:31.049: D/AFTER setContentView PJK 7 CollageActivity(21845):debug.memory:已分配:64.68MB of 192.00MB(15.22MB 可用)

(这是取自 Nexus 4 设备)。

在上面喜欢的 SO 问题中,我们唯一没有尝试过的是生成不同比例的背景图像。这仅占 3,932,160 (= 1280 x 768 x 4) 字节的分配。

DDMS(和 MAT)显示位图分配很大:

垫

有什么方法可以找出我们布局的哪一部分导致了如此大的分配(16,384,064 字节!)?(虽然我只是将图像重新缩放到那个大小,但这并没有帮助。)


编辑

再深入一点,我android:background从以下内容中删除了可绘制对象LinearLayout

   <LinearLayout
    android:id="@+id/collage_activity_layout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/bg_collage"
    android:orientation="horizontal" >

和内存分配时的距离!关于为什么 800 x 1280 背景(应该生成 800 x 1280 x 4= 4,096,000 字节图像)实际上生成 16MB 图像的任何想法?可能是因为 800(图像尺寸)和 768(屏幕尺寸)之间的差异吗?

4

2 回答 2

2

我们必须做两件事来解决这个问题:

  1. 我们使用的背景图像是 JPG。将图像更改为 PNG(用于两个方向)将使用量从 16MB 降低到大约 8MB。

  2. 图像还必须在每个方向上缩小 25%。这为我们提供了每次方向更改(大约 2MB)的更易于管理的分配。

于 2013-08-21T03:04:29.850 回答
-1

是的,我们可以在调试模式下看到堆增长并更新堆线程以在运行时查看堆更新。只需转到 DDMS 并调试您的应用程序进程,然后单击更新堆按钮并​​在右侧的堆选项卡中查看

于 2013-08-15T13:14:57.487 回答