2010-11-23 9 views
0

小さなビットマップを画面に描画し、画面をクリアするのに問題がある単純なアプリケーションを開発中です。私のビットマップは_graphicsというArrayListに格納されていますので、私はArrayListをクリアするために画面をクリアする必要があります。これは画面をクリアするのにうまくいきますが、しばらくしてからアプリケーションの強制終了になります。ビットマップを削除する際のエラー[Android]

画面に50ビットマップを描画すると、最初にクリアすると強制終了しますが、5を描画するとクラッシュする前に約10クリアを取得できます。私はこれが、GCがビットマップを正しくクリアしないことと関係があると考えています。誰かがそのテーマに関するアイディアを持っていますか?

+1

logcat出力を送信する必要があります。 – EboMike

+0

ここに行く:http://pastebin.com/DVNTGhZj – PeterW

答えて

1

Logcatファイルの読み込みエラー(新しいAndroid Dev:pは存在しないことがわかりました)が見つかりました。これはConcurrentModificationExceptionによるものです。すべてが現在動作しているようですD

1

OK - スタックトレースが添付されました:ConcurrentModificationException ArrayListを異なるスレッドから変更したり、繰り返したりします。アクセスを同期させるか、ConcurrentHashSetのような別のコレクションを使用する必要があります。

しかし、おそらく(私の原点の答え)以下では、あまりにも興味深いものになる:P

は、あなたが全体の画素データに実際のビットマップオブジェクトをキャッシュしていること、のような音 - >私は推測、あなたは

をOutOfMemoryExceptionが得

ガベージコレクタは非同期操作であり、ビットマップ配列をクリアすると、ビットマップは即座にメモリからアンロードされません。新しいものを挿入している場合、古いものはまだメモリに残っていて、新しいものもロードされます。

解決方法:この方法でビットマップをキャッシュしないでください。

彼らは異なるものです、あなたは(youtは、コンクリートscenrarioによって異なります)試すことができます。

1)それらはSDカードまたは何か他のものに格納されている場合は、あなたのコレクション内のビットマップのキャッシュのみのパスとそれらをロード、それらが描画のために必要な場合。

2)ビットマップの代わりにDrawableオブジェクトを使用する - ビットマップデータへのアクセスを最適化するための興味深い方法とアルゴリズムがあります。

3)パフォーマンスを最適化するには、SoftReferenceなど(おそらくWeakRefernceなど)を使用します。 SoftReferencesはオンデマンドでGCによってアンロードできます(メモリが不足している場合)。その場合、ソフト・リフレクションがヌルであるか、それとも依然として存在するかをチェックする必要があります。 例えば:

このコードsnipetがテストまたはJavaエディタで書かれていません
ArrayList<SoftReference<Bitmap>> _graphics = new ArrayList<SoftReference<Bitmap>>(); 
... 

for (int i = 0; i < _graphics.size(); i++) 
{ 
    Bitmap b = _graphics.get(i).get(); 
    if (b == null) 
    { 
     b = loadFromSomewhere(i); 
     _graphics.add(new SoftReference<Bitmap>(b), i); 
    } 
    ... do something wwith your bitmap 
} 

(入力ミスや間違ったメソッドのシグネチャを言い訳してください)。

+0

2)ビットマップの代わりにDrawableオブジェクトを使用する - ビットマップデータへの最適なアクセスのための興味深い方法とアルゴリズムがあります。この点について詳しく説明できますか? – 2cupsOfTech

関連する問題