1

以下のようなビットマップを作成しました。

// create bitmap in the below line Bitmap myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.googlelogo320x480); そして、それを ImageView に設定しました。

私の質問は次のとおりです: 1> 上記の Bitmap で Bitmap.recycle() を明示的に呼び出す必要がありますか? 2>「はい」の場合、いつ呼び出す必要がありますか? 3行目の直後、つまりビットマップをImageViewに設定した後、呼び出してみましたが、キャンバスがリサイクルされたオブジェクトを描画しようとしているという例外が発生します。3> コード内のビットマップで recycle() が呼び出されない場合、メモリ リークになりますか? PS: 私は ICS 以上に取り組んでいます。

4

3 に答える 3

4

この特定のケースでは、いいえ、recycle(); を呼び出すべきではありません。処理が完了すると、ImageViewrecycle() が呼び出されます。これはしばらくの間真実であり、ICS はこの事実を変えるために何もしませんでした。

画像の処理が完了したら、recycle() を呼び出す必要があります。たとえば、1 つの画像に 10 個のフィルターを適用し、各ステップで新しいビットマップを生成する場合、各ステップの後に古いビットマップで recycle() を呼び出す必要があります。

とはいえ、特に大きなビットマップの場合、同時に無制限の数のビットマップを持つことはできません。そんな時は賢く、動的にロード/アンロードする必要があります。

于 2012-10-27T14:41:43.810 に答える
2

recycle() を呼び出さなくてもメモリ リークは発生しませんが、アプリがメモリ制限を超えて爆発する可能性があります。以下を参照して、アプリが適格かどうかを確認してください。

  1. Bitmap の実際のバッキング データは Dalvik 制御メモリに保存されるため、ICS 以上にのみ関心がある場合は、recycle() の呼び出しについて心配する必要はありません。したがって、ビットマップへの参照を保持しない限り、Dalvk は問題なく GC できるはずです。
  2. Android 2.3 以前をサポートしたい場合でも、最終的には Bitmaps がリリースされるので、Bitmap を多用しないアプリであれば心配する必要はありません。
  3. ただし、Android 2.3 以前をサポートしていて、大量のビットマップを使用している場合は、ビットマップを使い終わったらすぐにリサイクルする必要があります。
于 2012-10-27T14:18:17.913 に答える
0

これを試して

if (myBitmap != null) {
    myBitmap.recycle();
    myBitmap = null;
}
Bitmap original = BitmapFactory.decodeFile(myFile);
myBitmap = Bitmap.createScaledBitmap(original, displayWidth, displayHeight, true);
original.recycle();
original = null;
于 2012-10-27T14:09:58.443 に答える