在J2ME中加载图像?

时间:2009-05-28 09:09:35

标签: image-processing java-me loading sprite

我对J2ME中存在的概念并不陌生,但我不应该以某种方式懒惰: 最近我的应用程序一直在将图像加载到内存中,因为它们是糖果......

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

而且我不确定它是最好的方式,但它在我的摩托罗拉Z6中运行良好,直到昨晚,当我在一台旧的三星手机中测试应用程序时,图像甚至无法加载并需要多次尝试启动出现的线程。屏幕保留为白色,所以我意识到它必须是关于图像加载的东西,我做得不好......有没有人可以告诉我如何在我的应用程序中正确地进行加载例程? / p>

3 个答案:

答案 0 :(得分:4)

我不确定您到底在寻找什么,但您所描述的行为听起来就像是在遇到OutOfMemory异常。尝试减少图像的尺寸(堆使用基于维度)并查看行为是否停止。这将告诉您它是否真的是OutOfMemory问题或其他问题。

其他提示:

  1. 从最大到最小加载图像。这有助于堆碎片并为最大的图像提供最大的堆空间。
  2. 卸载(设置为null),与您加载和垃圾收集的方式相反。调用GC后,请确保Thread.yield()。
  3. 确保只加载所需的图像。从应用程序不再存在的状态卸载图像。
  4. 由于您正在创建精灵,因此一个图像可能有多个精灵。考虑创建一个图像池,以确保只加载一次图像。然后只需将每个Sprite对象指向它所需的池中的图像。您的问题中的示例似乎很可能不止一次将相同的图像加载到内存中。这很浪费,可能是OutOfMemory问题的一部分。

答案 1 :(得分:1)

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

因为它们被分组为一个图像,所以每个图像都保存标题空间,因此可以减少使用的内存。

这种技术最初用于MIDP 1.0内存受限设备。

答案 2 :(得分: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;
    }
}

所以,每当我需要一个图像时,我首先会向池中询问它,或者只是将它加载到池中。