我不是很新的概念上存在J2ME,但我有点懒散的方式我不应该:最近我应用程序已经装载图像进入存储器,因为他们糖果...

Sprite example = new Sprite(Image.createImage("/images/example.png"), w, h);

我不太确定这是最好的方式,但它的工作现在我摩托罗拉Z6,直到昨天晚上,当我测试的应用程序在一个旧的三星手机和图像不会动和需要几个尝试的起始线显示出来。屏幕上是留在白,使我意识到,它有一些关于图片加载,我不是做得很好...有谁能告诉我怎么正确地做出一个载程序在我的程序?.

有帮助吗?

解决方案

我不确定你在找什么,但是你的行为描述很少听起来像你一样正在经历一个内存例外。尝试减少尺寸的图像(堆使用的是基于维),并看看如果该行为停止。这会让你知道,如果它确实是一个内存问题,或者别的东西。

其他建议:

  1. 负载的图像最大到最小。这有助于堆碎片和允许的最大堆的空间最大的图像。
  2. 卸载(设null)在相反的顺序你怎么装和垃圾收集之后这样做。确保线。产量()之后你打电话的GC。
  3. 确保你只载的图像,你需要的。卸载的图像从一个国家的应用程序不再是中。
  4. 因为你创造精灵你可能有多个精灵的一个图像。考虑创建一个图像游泳池,以确保你只载图像的一次。然后只要点的每一个精灵对象的图像内游泳池,它需要。你的例子,在你的问题好像你会超过可能负同样的图像进入存储器超过一次。这是浪费和可能是部分的内存问题。

其他提示

使用胶片图像(由一个图像中的定义的尺寸的一组图像),并使用逻辑来将它们拉出来一次一个。

由于它们一个分组到一个图像,则是保存每个图像头的空间,从而可减少所使用的存储器中。

这个技术是在MIDP 1.0存储器受限设备首先使用。

使用不反复加载图像的Fostah方法,我提出了以下类:

public class ImageLoader {
    private static Hashtable pool = new Hashtable();

    public static Image getSprite(String source){
        if(pool.get(source) != null) return (Image) pool.get(source);
        try {
            Image temp = Image.createImage(source);
            pool.put(source, temp);
            return temp;
        } catch (IOException e){
            System.err.println("Error al cargar la imagen en "+source+": "+e.getMessage());
        }
        return null;
    }
}

所以,当我需要一个图像I先问池,或者只是将其加载到池中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top