0

ビットマップを配列リストまたは配列に格納するアプリケーションを作成しています。android:largeHeap="true"マニフェストで、アプリケーションのメモリサイズを増やすように設定しました。20個のビットマップを作成しています。その後、新しいビットマップが作成された場合、最初のビットマップがリサイクル(削除)され、新しいビットマップが配列リストに追加されます。ビットマップを追加するたびにメモリが解放されますが、次の15〜20(合計35以上)以降、ビットマップヒープサイズは約20〜25MB増加しました。このプロセスは続行され、メモリ不足の例外が発生します。スペースは解放されていません。私は以下のそれぞれを個別にそしてすべて一緒に順番に試しました:

  1. ビットマップをリサイクルする
  2. nullを割り当てる
  3. 配列リストから削除

問題はまだあります。

ArrayList<Bitmap> linesbitmap;

private void touch_start(float x, float y) { // function called on every touch
    if (index >= 19) {
        while (linesbitmap.size() >= 19) {
            linesbitmap.get(0).recycle();
            linesbitmap.remove(0);
        }
        System.gc();
        System.runFinalization();
        System.gc();
    }
    if (mBitmap != null) {
        linesbitmap.add(Bitmap.createBitmap(mBitmap));
    }
    index = linesbitmap.size();
}
4

2 に答える 2

3

配列リストまたは配列でビットマップを作成および削除すると、ヒープサイズが増加しました。ビットマップをに変換ByteArrayOutputStreamし、配列リストに保存しました。ヒープサイズの新しいオブジェクトを削除または追加してByteArrayOutputStreamも、複数のビットマップを保存および削除する場合のように大きくなりません。

ArrayList<ByteArrayOutputStream> arraylist=new ArrayList<ByteArrayOutputStream>();
new Thread(new Runnable() {
    @Override
    public void run() {
        Bitmap bitmap = Bitmap.createBitmap(mBitmap);
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        if (mBitmap != null) {
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
            arraylist.add(out);
        }
    }
}).start();
于 2012-07-06T12:12:13.053 に答える
0

質問から、ArrayListキャッシュメカニズムとしてを使用しているようです。その場合はLruCache、APIレベル12で導入されたものを確認できますが、古いAPIレベルの互換性パッケージにも含まれています。

于 2012-04-27T07:01:59.870 に答える