Frage

Ich habe rund 100 Symbole angezeigt werden (jeweils 50x50) in Taste. Ich lade großes PNG-Bild, das alle 100 Symbole enthält, dann erzeuge ich jedes Symbol Image.subImage() Methode.

Aber meine Anwendung immer OutOfMemoryError.

Ich denke an 2-Lösung für diese:

  1. download 100 Symbole wie Teer (kombiniert in einzelne Datei). Also kann ich erstellen Symbol eins nach dem anderen. Großes Bild Notwendigkeit in Erinnerung sein nicht, bis ich erstellen letztes Symbol.
  2. großes Bild herunterladen, aber nicht klein icon.Then Override-Button erstellen Klasse males Bild (Symbol) von großen Bild.

Welches ist die beste Lösung? oder Sie haben keine andere Lösung für dieses Problem.

War es hilfreich?

Lösung

LWUIT ist für kleine Geräte entwickelt, und so sollten Sie Ihren Code entwerfen. So ein großes Bild ist keine gute Idee.

Sie sollten wirklich separate Bilder verwenden. und nur diejenigen in Erinnerung behalten, dass Sie sehen können. Oder Sie werden in OutOfMemory Fehler weiterlaufen.

würde ich es so handhaben. Holen Sie sich ein cachemap. wenn Sie ein Bild möchten, prüfen Sie, ob es nicht bereits im cachemap ist. wenn es ist, verwenden Sie das Bild aus dem cachemap wenn es nicht herunterladen und setzt das Bild in der cachemap. wenn Sie von Speicher unterwegs sind, das letzte Bild aus dem cachemap entfernen und die neuen Download bereit.

    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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top