1

私の Android アプリには、ImageView と TextView からビットマップを取得し、それを SDCard に保存する機能があります。関数の最後で、現在、ビットマップ オブジェクトに対して recycle() を呼び出し、ImageView に対して destroyDrawingCache() を次のように呼び出しています。

b1.recycle();
bitmap.recycle();
imgView.destroyDrawingCache();

b1 と bitmap は Bitmap オブジェクトで、ローカル変数です。imgView は ImageView オブジェクトであり、フィールドです。imgView は、アプリケーションの実行時に頻繁に再作成されます。これらの 3 行のコードを含めることは、パフォーマンスとメモリの点で良い考えですか? それとも、ガベージ コレクターが自動的に作業を行うので、それらを含めると、アプリケーションが 3 つのメソッド呼び出しを行う必要があるため、アプリケーションの速度が低下しますか?

4

1 に答える 1

2

ドキュメントからの引用

http://developer.android.com/training/displaying-bitmaps/manage-memory.html

Android 2.3.3 (API レベル 10) 以前では、recycle() の使用が推奨されます。アプリで大量のビットマップ データを表示している場合、OutOfMemoryError エラーが発生する可能性があります。recycle() メソッドを使用すると、アプリはできるだけ早くメモリを再利用できます。

Android 3.0 (API レベル 11) では BitmapFactory.Options.inBitmap フィールドが導入されています。このオプションが設定されている場合、Options オブジェクトを受け取るデコード メソッドは、コンテンツの読み込み時に既存のビットマップを再利用しようとします。これは、ビットマップのメモリが再利用されることを意味し、パフォーマンスが向上し、メモリの割り当てと割り当て解除の両方が削除されます。ハニカム以降のバージョンでは、ビットマップ ピクセル データがヒープに割り当てられます。したがって、この場合は recycle を呼び出す必要はありません。gc が起動すると、ビットマップに割り当てられたメモリが解放されます。

メモリを解放するのはガベージ コレクタの仕事です。メモリを再利用する必要がある場合、ガベージ コレクタが作動します。GC deos はマークおよびスイープします。logcat で確認できます。

休憩時間が見られます。ヒープを大きくすると、より頻繁に gc が開始され、より頻繁に一時停止します。

 GC_CONCURRENT freed <1K, 14% free 21220K/24455K, paused 6ms+26ms
 GC_CONCURRENT : Jumps in because Heap is full
 14% free 21220K/24455K After this collection 14% of memory is free. Check the heap usage.
 paused 6ms+26ms Time taken to collect garbage.

このトピックに関する講演があります @ https://www.youtube.com/watch?v=_CruQY55HOk

于 2013-05-29T19:24:07.210 に答える