11

Android Developersサイトによると、Bitmap.recycle()メソッドの定義は次のとおりです。

このビットマップに関連付けられたネイティブ オブジェクトを解放し、ピクセル データへの参照をクリアします

ImageView多くのビットマップを作成/デコードし、結果のビットマップオブジェクトをsに入れるアプリケーションをいくつか開発しました。時々、次のような有名な例外があります。

ビットマップ サイズが vm の予算を超えました

メモリ不足エラー

また、それを引き起こす可能性のあるメモリリークはないと確信しています。

多くの検索の後、「リサイクル」メソッドを発見し、不要になったビットマップのネイティブ メモリを解放するために使用しました。 それはとても役に立ったようです。

システムが明示的に呼び出さずにとにかくこれを行っていることを知っているので、それがこの状況で私がすべきことかどうかを尋ねています(そうですか?多分私は間違っています)。

このような状況でこの方法を使用する必要がありますか?

この方法はどのような状況で使用する必要がありますか?

この方法を使用する必要がありますか?

前もって感謝します。

アップデート:

Google は最近、このガイドを投稿しました。

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

4

2 に答える 2

3

どのような状況でこの方法を使用する必要がありますか?

ビットマップは、決定するたびに GC によって GC されます。ただし、状況によっては、遅延が発生する場合があります。Java の経験則を常に覚えておいてください (他の PL にも当てはまるかもしれません)。GC によるオブジェクトのリサイクルの速度は、オブジェクトの作成の速度と同じではない可能性があります。

つまり、recycle() は、できるだけ早くメモリを解放したい場合は、recycle() を呼び出す必要があることを意味します

この方法を使用する必要がありますか??

これは高度な呼び出しであり、通常、このビットマップへの参照がなくなると通常の GC プロセスによってこのメモリが解放されるため、呼び出す必要はありません。エラーが発生した場合は、これを使用する必要があります。

于 2012-06-26T07:26:59.537 に答える
0

ビットマップがもう使用されないことがわかっている操作で使用します。

public static Bitmap getMaskedContactImage (Context context, Bitmap contactImageBitmap, int maskToBeApplied) {  
    Bitmap mask = BitmapFactory.decodeResource(context.getResources(), maskToBeApplied);
    Bitmap output = Bitmap.createBitmap(mask.getWidth(),mask.getHeight(), Config.ARGB_8888);
    final Rect finalRect = new Rect(0, 0, contactImageBitmap.getWidth(), contactImageBitmap.getHeight());
    final Rect originRect = new Rect(0, 0, mask.getWidth(), mask.getHeight());
    Canvas canvas = new Canvas(output);

    Paint xferPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    xferPaint.setColor(Color.BLACK);

    xferPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));

    canvas.drawBitmap(contactImageBitmap, finalRect, originRect, null);
    canvas.drawBitmap(mask, originRect, originRect, xferPaint);

    contactImageBitmap.recycle();
    mask.recycle();

    return output;
  }

そのような場所では、マスクや contactImage を使用しないと確信しています。

ビットマップの表示に役立つビットマップ処理の本当に優れたリソースを見つけました。

よろしく、アレックス

于 2012-06-26T07:28:28.307 に答える