0

問題

やあ、

ユーザーがいくつかの写真とそれらが画面に表示される時間を指定するアプリケーションを開発しています.そのため、小さなアニメーションのようなものを作成したり、画像を短時間表示したりすることがあります.問題は、しばらくすると、画像がプレビューされるべきときにプレビューされず、数ミリ秒のエラーが発生します。私が開発しているアプリケーションでは時間が重要なので、問題の可能性について助けてください。

コード

それがどのように機能するかを説明しましょう.私は自分のウェブアプリから写真を撮り、それらをHashMapに保存します.

Bitmap image = ImageOperations(url,String.valueOf(frameNum) + ".jpg");

ImageMap.put(String.valueOf(frameNum), image);

Mathod ImageOperations は次のようになります。

private Bitmap ImageOperations(String url, String saveFilename) {
        try {
            Display display = getWindowManager().getDefaultDisplay();
            InputStream is = (InputStream) this.fetch(url);
            Bitmap theImage = BitmapFactory.decodeStream(is);
            if (theImage.getHeight() >= 700 || theImage.getWidth() >= 700) {
                theImage = Bitmap.createScaledBitmap(theImage,
                        display.getWidth(), display.getHeight() - 140, true);
            }
            return theImage;
        } catch (MalformedURLException e) {
            e.printStackTrace();
            return null;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }

    }

そこで後でユーザーが指定したときにUIを更新するスレッドを実行します.それを更新する方法はこれです.

public void setPictures(int NumOfFrame) {
if (frameArray.get(NumOfFrame - 1).frame_pic.contains("n/a") != true) {
ImagePlace.setImageBitmap(ImageMap.get(String.valueOf(NumOfFrame)));
} else {
        ImagePlace.setImageDrawable(null);
}

}

イメージを更新した後、スレッドをスリープ状態にし、再度実行するとスレッドが更新されます。問題を引き起こす何かがありますか?それはガベージ コレクションと関係がありますか?

前もって感謝します

4

2 に答える 2

1

おそらく問題は、追加の画像をロードするときにヒープサイズを大きくすることです。状況がより明確になり、アプリのタイミングの全体像がわかるように、プロファイリングを行うことをお勧めします。

于 2012-10-28T10:06:33.097 に答える
0

まず、ここでnullチェックがありません:

ImageMap.get(String.valueOf(NumOfFrame))

また、ここでは古いビットマップをリサイクルしません。

theImage.recycle(); // missing line
theImage = Bitmap.createScaledBitmap(theImage,
                        display.getWidth(), display.getHeight() - 140, true);

問題の説明から、メモリ不足の例外が発生する可能性があります。

またBitmapFactory.decodeStream、失敗したときに例外をスローするかどうかもわかりません。そこにもヌルポイントチェックを追加する必要があります。

于 2012-10-28T09:43:58.603 に答える