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
}
(入力ミスや間違ったメソッドのシグネチャを言い訳してください)。
logcat出力を送信する必要があります。 – EboMike
ここに行く:http://pastebin.com/DVNTGhZj – PeterW