9

Androidの開発者サイトによると、Bitmap.recycle()メソッドの定義は次のとおりです。Bitmap.recycle()を使用する必要がありますか?

無料このビットマップに関連付けられているネイティブオブジェクト、と私はいくつかを開発してきました

ピクセルデータへの参照をクリア多くのビットマップを作成/デコードしているアプリケーションで、結果のビットマップオブジェクトをImageViewに設定します。

はまた、私は確信している

とメモリエラーのうち

ビットマップのサイズexcceded VM予算:時々私のような有名な例外を持っています私はそれを引き起こすメモリリークはありません。

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

私はシステムがこれを明示的に呼び出すことなく実行していることを知っているからです(それは多分私が間違っているかもしれません)。

このような状況でこのメソッドを使用する必要がありますか?

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

このメソッドをまったく使用する必要がありますか?

ありがとうございます。

はUPDATE:

のAndroid 2.3.3(APIレベル10)と低オン

、()のリサイクルを使用してをお勧めします。

Googleは述べている、最近thisガイドを掲載しました。大量のビットマップデータをアプリに表示している場合、OutOfMemoryErrorエラーが発生する可能性があります。 recycle()メソッドを使用すると、できるだけ早くメモリを再利用することができます。

+5

それは 'recyle'を呼び出す必要はありません。それは助けることができますが、それが正しく使用されているときだけです。実際には、 'Bitmap'オブジェクトに' WeakReference'を作成し、それを代わりに返す方がずっと簡単です。 [あなたはこのGoogleのIOの話を見てください](http://www.youtube.com/watch?v=_CruQY55HOk) – adneal

+0

@夕方:ありがとう、そのビデオは長い時間前に見た。 –

答えて

3

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

ビットマップは決定するたびにGCによってGCされますが、状況によっては遅延が発生することがあります。 いつもjavaのサムルールを覚えておいてください(P.Lも同様です)。GCによるオブジェクトのリサイクルの速度は、オブジェクトを作成する速度と同じではない場合があります。あなたはリサイクルを呼び出す必要がありますできるだけ早くメモリを解放したい場合は

ので(リサイクル)が()

は私がすべてで、このメソッドを使用する必要があります意味します?

これは、高度なコールであり、通常、あなたがビットマップの大きさなどの問題に直面している場合は、このbitmap.Butへの参照がなくなったときに、通常のGCプロセスがこのメモリを解放するので、呼び出す必要はありませんvmの予算を超えてまたはメモリ不足これを使用する必要があります。

0

私はビットマップがもう使用されないことがわかっている操作で使用します。その1つのような場所で

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を使用するつもりはないことを確認イム。

Displaying bitmapsという有益なビットマップ処理のリソースが見つかりました。

よろしく、 アレックス

関連する問題