我的应用程序 [1] 遇到严重的内存问题。为了调查这一点,我在不同状态下对我的应用程序进行了堆转储。我发现一些位图占用了大量内存。我编写了一个小工具 [2],将字节数组解码为 Windows 位图文件 (.bmp),这样我就可以see位图并将它们与我的文件中的文件进行比较res/drawable
folder.
我发现我的所有文件都被上采样了两次。
我首先检查了最大的一个:堆中超过 9MB 的字节数组缓冲区,它被解码为漂亮的 1920x1280 图片,而原始图片是 960x640 png 文件。
我尝试了第二大的,超过 3MB,解码后显示出漂亮的 754x1200 图片,原始大小是......你猜怎么着?一个漂亮的 377x600 jpg 文件。
是什么赋予了?
我已经在 Android Manifest 文件中启用了硬件加速(尽管我不确定我是否真的需要它,我只是使用一些基本的视图和活动)。
我在 GSM Galaxy Nexus (yakju) 上运行 Android 4.0.2。我收到测试人员的反馈,他们的 4.0.3 Nexus S 上存在这个问题,但我还无法检查他们的堆转储。
我试图在这里节省内存,如果 Android 将所有内容加倍,难怪应用程序会很快崩溃,因为堆使用率太高(在我的情况下约为 64MB)。我希望有一个理由和解决办法。
参考:
- 加载活动时出现 OutOfMemoryError https://stackoverflow.com/questions/9536521/outofmemoryerror-when-loading-activities
- 如何实际查看从 Android 堆转储中获取的位图 https://stackoverflow.com/questions/9611592/how-to-actually-see-a-bitmap-taken-from-an-android-heap-dump
当您将图像放入res/drawable
,Android 会假设它们的 dpi 为 160,即与将它们放入res/drawable-mdpi
。 Galaxy Nexus 是一款 xhdpi 设备,即它的(广义)dpi 为 320。为了补偿高分辨率显示,Android 会将图像上采样 200%。
解决办法很简单,把图片放进去就可以了res/drawable-xhdpi
反而。然后,声明的图像 dpi 将与您运行的显示器相匹配,并且 Android 不会对图像执行任何缩放。
请参阅http://developer.android.com/guide/practices/screens_support.html http://developer.android.com/guide/practices/screens_support.html了解更多信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)