java-me - JavaME - LWUIT 图像耗尽所有内存

标签 java-me midlet lwuit

我正在使用 LWUIT 编写 MIDlet,图像似乎占用了大量内存。我使用的所有图像都是 PNG 并打包在 JAR 文件中。我使用标准 Image.createImage(URL) 方法加载它们。该应用程序有许多表单,每个表单都有几个标签和按钮,但是我相当确定只有事件表单保留在内存中(我知道它不太值得信赖,但 Runtime.freeMemory() 似乎证实了这个)。

该应用程序在 240x320 分辨率下运行良好,但将其移动到 480x640 并为 UI 使用适当更大的图像开始导致出现内存不足错误。该应用程序的功能之一是下载远程图像。在达到这一点之前,该应用程序似乎运行良好。下载几个 PNG 并返回主菜单后,遇到内存不足错误。当然,我研究了主菜单使用的内存量,结果非常令人震惊。它只是两个带有图像的标签和四个按钮。每个按钮都有三个图像,分别用于 style.setIcon、setPressedIcon 和 setRolloverIcon。图像大小范围为 15 到 25KB,但删除每个按钮使用的三个图像中的两个(因此总共 8 个图像),Runtime.freeMemory() 显示内存使用量惊人地减少了 1MB。

在我看来,我要么有很多内存泄漏(我认为我没有这样做,但内存泄漏并不完全已知可以轻易追踪),我正在做一些非常错误的事情图像处理或者确实没有问题,我只需要缩小规模。

如果有人能提供任何见解,我将不胜感激。

最佳答案

移动设备的内存通常非常低。所以你必须使用一些技巧来节省和使用内存。

我们在一个项目中遇到了同样的问题,我们是这样解决的。

对于下载的图像: 在放置图像的地方创建一个缓存。如果您需要图像,请检查它是否在缓存映射中,如果没有,请下载并将其放在那里,如果是,请使用它。如果内存已满,请删除缓存映射中最旧的图像,然后重试。

对于其他资源图片: 只要您能看到它们,就将它们保留在内存中,如果您看不到它们,请中断引用,gc 将为您进行清理。

希望这有帮助。

关于java-me - JavaME - LWUIT 图像耗尽所有内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1390087/

相关文章:

java - 哪些手机支持哪种 J2ME(Java 微型版)规范?

J2me GameCanvas 上的黑莓广告

java - 如何将 BBM bin 转换为 DeviceId

java - 如何使 J2ME 应用程序在后台运行?

java - 如何在 lwuit 中为相同文本添加第二个前景色

java - lwuit.html.CSSEngine.applyStyleToUIElement 的 NullPointerException(未知来源)

java - (J2me) 流作为缓冲区?

java - midlet 和 corelet 之间有什么区别?

java - J2ME Midlet和PC之间如何通信?

android - 将 Android 移植到新的 LWUIT 1.5