安卓 - 背景图片占用过多内存

3
在我的游戏中,我有三个活动:主菜单->子菜单->游戏界面。所以当用户在游戏界面玩耍时,前两个活动是不活动的,但没有被销毁。
每个布局都有一个漂亮的背景图片。这个图片本身很小(40k),但在大屏幕上(比如Galaxy平板电脑),它会占用几兆字节的内存。从前两个活动中删除背景之后,第三个活动中的内存使用量从18M降至13M!
有没有办法保留背景,并恢复所有这些浪费的内存?

1
我在考虑一个临时解决方案,你可以在第三页时有一个onclick事件,将前两个页面的背景移除,然后在返回时恢复它们。 - Vic Vuci
4个回答

5
由于布局中的背景图片,我经历了类似的问题。图像的内存分配应该是高*宽*4字节(在 ARGB_8888 模式下,默认模式)。
如果在显示活动时看到18MB的分配,则必须有一些问题。请检查是否将背景图像放在 drawable 文件夹中。在这种情况下,系统必须将该图像缩放到屏幕的特定密度,从而导致大量的内存开销。
解决方案:
1.在每个 drawable 文件夹中放置一个特定版本的背景图像(mdpi、hdpi、xhdpi...),以便系统无需执行任何缩放过程。
2.将背景图像放在一个名为 "drawable-nodpi" 的特殊资源文件夹中。系统不会尝试缩放放置在此目录中的图像,因此只进行拉伸处理,分配的内存将是预期的。
更多信息请参见此答案 希望能帮助到您。

嗨,这是我搜索了几天的解决方案。我已经缓存了图像并对它们进行了解码,但除了这个之外,没有一个能够正常工作。非常感谢。只需将高分辨率图像添加到xxhdpi文件夹即可。 - smoothumut

3

3
为什么不在开始新活动(C)时完成之前的活动。然后您可以重写活动C中的onKeyDown方法以启动先前的活动(B)。

我该如何在启动C时完成B?我的意思是在代码中应该放置C.finish()? - dop2000
1
不要这样,只需在启动新活动的意图之前调用finish()即可。 - Saurabh Verma

0
我建议在你的活动中重写onPause()或onStop()方法。在这里,你可以释放背景(通过调用layout.setBackgroundDrawable(null))。

你可以随时添加一个显式调用 System.gc()。同时确保你的活动本身不再引用背景图像。 - Marc Van Daele

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接