6

ランドスケープ モードに変更すると、全画面のビットマップでいくつかのオブジェクトが作成されます。

スクロールすると、他のオブジェクトが呼び出され、そのビットマップが表示されます。これを繰り返し行うと、ビットマップ サイズがvm予算エラーを超えています。ビットマップを作成しています.... recycle()GC()

    bitmap = Bitmap.createBitmap(ChartProperties.getChartWidth(), 
                    ChartProperties.getChartHeight(),
    Bitmap.Config.RGB_565);

    imageCache.put(String.valueOf(LandscapeChartActivity.getActiveFeature()),
                    new SoftReference(bitmap));

    if(imageCache != null){

        for (int i = 0; i < imageCache.size(); i++) {

            if (imageCache.get(String.valueOf(i)) != null) {
                imageCache.get(String.valueOf(i)).get().recycle();
                imageCache.put(String.valueOf(i), null);                    
            }

        }
        Runtime.getRuntime().gc();
        imageCache.clear();
        imageCache = null;
4

1 に答える 1

7

ビットマップが原因で、OOME でも同じ問題が発生しました。

向きが PORTRAIT から LANDSCAPE に、またはその逆に変わると、以前の UI は完全に破棄され、新しい UI が読み込まれて表示されます。この場合、アプリで多くのビットマップを使用している場合は、適切な場所でそれらを解放する必要があります。

デバイスの向きを確認するには、こちらを参照してください: Android フォンで向きを確認する

あなたの場合、向きの変更中にビットマップをクリアする必要があります。

上記のリンクで、現在の向きを取得する方法を見つけることができます。したがって、向きが変わるたびに、ビットマップをクリーンアップする上記のコードを呼び出します。

ここで、logcat を確認すると、常に GC_ というログが表示されますが、それを理解できなかったので、メモリ リークの問題に関する素晴らしいドキュメントを見つけました: http://codelog.dexetra.com/getting-around-アンドロイド・メモリー・ブルース

上記のリンクは、問題に非常に役立ちます。

現在、アプリでメモリ リークが発生すると OOME が発生します。それを確認するには、MAT for eclipse をインストールしてください。http://www.eclipse.org/mat/downloads.phpで見つけることができます。

少し複雑なソフトウェアですが、操作を進めていくと、非常に便利なソフトウェアであることがわかります。

これで問題が解決しない場合でも、WeakReferenceビットマップには を使用してください。

このリンクを参照してください: How to use WeakReference in Java and Android development?

さらなる情報がわかれば、この投稿を更新します。

問題の解決策が得られたら、投稿を更新してください。

ありがとうございました :)

于 2012-05-24T13:07:26.507 に答える