web-dev-qa-db-ja.com

ImageView.setImageBitmap()は以前に設定されたビットマップをリサイクルしますか?

以下のようなコードがあるとしましょう。

protected void onCreate(Bundle bundle){

    this.imageView = (ImageView) contentView.findViewById(R.id.imageView);

    this.setFirstBitmap();
    this.setSecondBitmap();
}

private setFirstBitmap(){
    Bitmap bitmap1 = BitmapFactory.decodeFile(bitmapFile1);
    imageView.setImageBitmap(bitmap1);
}

private setSecondBitmap(){
    Bitmap bitmap2 = BitmapFactory.decodeFile(bitmapFile2);
    imageView.setImageBitmap(bitmap2);
}

この場合、imageViewはbitmap1をリサイクルしますか、それともbitmap2を設定する前にリサイクルする必要がありますか?

14
W.K.S

ImageViewはビットマップを自動的に解放しません

@Vipulによって説明されているように起こります

ビットマップ参照は、bitmap.recycle()を呼び出して解放する必要があります

別のビットマップをImageViewに割り当てたい場合は、を呼び出して前のビットマップをリサイクルします

((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle();

見てください this

25
Blackbeard

2番目のビットマップをデコードして設定しようとするとJavaは、開発者が最初のビットマップを使用しなくなったため、最初のビットマップをリサイクルする必要があることをGCに通知します。GCは後でそれを行います。

ただし、ビットマップを多用する場合(割り当ての速度はビットマップがリサイクルされる速度よりも速い場合があります)、未使用のビットマップをできるだけ早くリサイクルすることをお勧めします。ビットマップの使用が終了したら、recycle()を呼び出す必要があります。 (画面に表示されているときにビットマップをリサイクルしようとしないでください。)

9
Vipul Shah