1

我必须在 Button 中显示大约 100 个图标(每个 50x50)。我正在下载包含所有 100 个图标的大 png 图像,然后我使用Image.subImage()方法创建每个图标。

但我的应用程序越来越OutOfMemoryError.

我正在考虑两种解决方案:

  1. 将 100 个图标下载为 tar(合并为单个)文件。所以我可以一个一个地创建图标。在我创建最后一个图标之前,大图像不需要在内存中。
  2. 下载大图像但不要创建小图标。然后覆盖按钮类以从大图像中绘制图像(图标)。

哪个是最好的解决方案?或者你有任何其他解决这个问题的方法。

4

1 回答 1

2

LWUIT 是为小型设备设计的,因此您应该设计您的代码。所以大图像不是一个好主意。

你真的应该使用单独的图像。并且只保留那些你可以看到的记忆。否则您将继续遇到内存不足的错误。

我会这样处理。获取缓存映射。如果你想要一张图片,检查它是否已经在缓存映射中。如果是,则使用缓存映射中的图像,如果没有下载它并将图像放入缓存映射中。当您的内存不足时,从缓存映射中删除最后一个图像并下载新的。

    if (imageCache.get(url) != null) {
        //#debug
        System.out.println("Get cached image from: " + url);

        asyncImage.setImage((Image) imageCache.get(url));
        asyncImage.setQueued(false);
    } else {
        //#debug
        System.out.println("Start download image from:" + url);

        map.put(url, asyncImage);

        ImageDownloadService d = new ImageDownloadService(url, new ActionListener() {

            public void actionPerformed(ActionEvent evt) {

                NetworkEvent n = (NetworkEvent) evt;
                Image image = (Image) n.getMetaData();
                String url = n.getConnectionRequest().getUrl();
                AsyncImage asyncImage = (AsyncImage) ImageManager.this.map.get(url);
                map.put(url, asyncImage);
                asyncImage.setImage(image);
                map.remove(url);
                imageCache.put(url, asyncImage.getImage());
                asyncImage.setQueued(false);
                if (Display.getInstance().getCurrent() instanceof AsyncLoadable) {
                    ((AsyncLoadable) Display.getInstance().getCurrent()).asyncLoaded();
                } else {
                    Display.getInstance().getCurrent().repaint();
                }
                //#debug
                System.out.println("Retrieved image from:" + url);
            }
        });
        d.addResponseCodeListener(new ActionListener() {

            public void actionPerformed(ActionEvent evt) {
                NetworkEvent n = (NetworkEvent) evt;
                String url = n.getConnectionRequest().getUrl();
                AsyncImage asyncImage = (AsyncImage) ImageManager.this.map.get(url);
                asyncImage.setQueued(false);
                map.remove(n.getConnectionRequest().getUrl());
                //#debug
                System.out.println("Failed image from:" + url);
            }
        });

        NetworkManager.getInstance().addToQueue(d);
于 2010-12-08T13:15:43.290 回答