Большое изображение с множеством значков или одно изображение с одним значком? - PullRequest
1 голос
/ 30 июня 2010

Мне нужно отобразить около 100 иконок (каждый 50х50) в кнопке.Я загружаю большое изображение PNG, которое содержит все 100 значков, затем я создаю каждый значок, используя метод Image.subImage().

Но мое приложение получает OutOfMemoryError.

.это:

  1. скачать 100 иконок в виде tar (объединены в один) файл.Так что я могу создать значок один за другим.Большое изображение не должно находиться в памяти, пока я не создам последнюю иконку.
  2. Загрузите большое изображение, но не создавайте маленькую иконку. Затем переопределите класс Button для рисования изображения (иконки) из большого изображения.*

    Какое решение является лучшим?или у вас есть другое решение этой проблемы.

1 Ответ

2 голосов
/ 08 декабря 2010

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);
...