2

私は次のコードを持っています:

loadedImageDraggable.setBitmap(bitmap);
Log.v(TAG, "recycled image1 :"+bitmap);
Log.v(TAG, "recycled image2 :"+loadedImageDraggable.getBitmap());
bitmap.recycle();
bitmap = null;
Log.v(TAG, "recycled image3 :"+bitmap);
Log.v(TAG, "recycled image4 :"+loadedImageDraggable.getBitmap());

したがって、これをコーディングしたときに期待したのは、ビットマップオブジェクトがメモリから削除されることです。コードを実行したときに実際に得たのは、次のログトレースです。

recycled image1 :android.graphics.Bitmap@41afa8e0
recycled image2 :android.graphics.Bitmap@41afa8e0
recycled image3 :null
recycled image4 :android.graphics.Bitmap@41afa8e0

最後の行で、loadedImageDraggableにラップされたこのビットマップオブジェクトがまだ残っていることがわかります。オブジェクトは参照を介してメソッドに渡されるため、オブジェクトがnullに設定されたときに、Javaがそのビットマップオブジェクトへのすべての参照をクリーンアップすることを期待していました。私は混乱しています:/誰かが私のためにこれを片付けることができますか?

4

2 に答える 2

2

同じビットマップオブジェクトへの2つの参照があります。1つはbitmapもう一方が内部にあり、nullにloadedImageDraggable 設定した場合、内部の参照はもちろん変更されません。それでもあなたのBitmap@41afa8e0を指していますbitmaploadedImageDraggable

于 2012-09-14T10:10:45.030 に答える
1

さらに説明する前に、リサイクルがどのように機能するかについての一般的な概要を説明したいと思います。

これが定義です、

public void recycle()以降:APIレベル1bitmap.recycle()このビットマップに関連付けられているネイティブオブジェクトを解放し、ピクセルデータへの参照をクリアします。これは、ピクセルデータを同期的に解放しません。他に参照がない場合は、単にガベージコレクションを許可します。ビットマップは「デッド」としてマークされます。つまり、 getPixels()またはsetPixels()が呼び出された場合は例外がスローされ、何も描画されません。この操作を元に戻すことはできないため、ビットマップをこれ以上使用しないことが確実な場合にのみ呼び出す必要があります。これは高度な呼び出しであり、通常は呼び出す必要はありません。これは、このビットマップへの参照がなくなると、通常のGCプロセスがこのメモリを解放するためです。

あなたの場合、あなたはまだビットマップオブジェクトへの参照を保持しています..しかし、ビットマップを描画可能にするための呼び出しをDEADにしました。

loadedImageDraggablesetBitmap(null)でを無効にする場合。GCの対象となります。

それでも、GCの動作はいくつかの条件に依存しており、そのうちの1つはリソースの不足です。それまで、あなたはそれが集められることを決して知りません。これがあなたにもっと良い理解を与えることを願っています。

于 2012-09-14T10:33:03.997 に答える