1

ボタンに約 100 個のアイコン (各 50x50) を表示する必要があります。100個のアイコンすべてを含む大きなpng画像をダウンロードしてから、メソッドを使用して各アイコンを作成しますImage.subImage()

しかし、私のアプリケーションはOutOfMemoryError.

私はこれに対する2つの解決策を考えています:

  1. 100 個のアイコンを tar (単一に結合) ファイルとしてダウンロードします。だから私はアイコンを1つずつ作成できます。最後のアイコンを作成するまで、Big Image をメモリに保存する必要はありません。
  2. 大きな画像をダウンロードしますが、小さなアイコンを作成しないでください。次に、Button クラスをオーバーライドして、大きな画像から画像 (アイコン) を描画します。

最適なソリューションはどれですか? または、この問題に対する他の解決策はありますか。

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 に答える