1

オブジェクトを作成して変数に代入すると:

Obj obj1 = null;
obj1 = myFunction(params);

(ここでmyFunctionは複雑なオブジェクトを作成します)

その後、変数を再割り当てします。

obj1 = myFunction(otherparams);   

以前のオブジェクトを破棄していないため、その瞬間にメモリ リークが発生しますか?

実際の状況は次のとおりです。

Bitmap bmp;
bmp = drawMyBitmap(3);
//... some code
bmp = drawMyBitmap(4);

ここでメモリリークが発生しますか?

もちろん、 を呼び出さなければならないことはわかってbmp.recycleいますが、実行できません。実際のコードは次のとおりです。

Bitmap bmp;
bmp = drawMyBitmap(3);
imageView.setImageBitmap(bmp);
//... some code
// if I try to do recycle here - I receive java.lang.IllegalArgumentException: Cannot draw recycled bitmaps
// But I need to recreate bitmap every some minutes
bmp = drawMyBitmap(4);
imageView.setImageBitmap(bmp);

では、ビットマップをリサイクルしてメモリ リークを回避するにはどうすればよいでしょうか。

4

3 に答える 3

1

私が理解しているように、あなたの問題は、ビットマップが使用されているためにリサイクルできないことです。かなり素朴なので、間違っているかもしれませんが、次のようにします。

imageView.setImageBitmap(bmp);
//... some code
Bitmap tmp = bmp;
bmp = drawMyBitmap(4);
imageView.setImageBitmap(bmp);
tmp.recycle(); // As it's not anymore referenced by the ImageView, you can recycle the Bitmap safely

私はそれをテストしませんでした。フィードバックを与えます。

于 2012-11-14T09:25:28.277 に答える
0
 Bitmap bmp;
 bmp = drawMyBitmap(3);
 imageView.setImageBitmap(bmp);
 //... some code
 // if I try to do recycle here - I receive java.lang.IllegalArgumentException: Cannot    draw recycled bitmaps
 // But I need to recreate bitmap every some minutes
 Bitmap temp = bmp;  //try this
 bmp = drawMyBitmap(4);
 imageView.setImageBitmap(bmp);
 temp.recycle();
于 2012-11-14T09:40:53.080 に答える
0

最初のケースでは、最初のオブジェクトの参照を解放するので、ガベージ コレクターはそれを破棄し、新しい参照のために 2 番目のオブジェクトをメモリ上に残します。

2番目のケースでは、ビットマップをImageViewに設定している場合、ビューには画像を描画するためのビットマップがなく、ビットマップのリサイクルされた例外がスローされるため、それらをリサイクルすることはできません。メモリ上に 2 つのビットマップを保持するメモリ。

必要に応じて、ビットマップ オプションを使用してそれらを作成し、メモリ消費を最適化してみてください。

于 2012-11-13T15:45:50.940 に答える