ImageView
を使用して画像を表示する単純な Android アプリケーションを作成しています。ボタンをクリックすると、現在の画像に基づいて新しいビットマップが生成され、古い画像が置き換えられます。
私が使用した画像は大きくありません: 220 x 213 .
しかし、エミュレーターでボタンを5回クリックすると、エラーがスローされます。
java.lang.OutOfMemoryError: bitmap size exceeds VM budget
私はいくつかの記事を読みました:
- java.lang.OutOfMemoryError: ビットマップ サイズが VM の予算を超えています - Android
- http://androidactivity.wordpress.com/2011/09/24/solution-for-outofmemoryerror-bitmap-size-exceeds-vm-budget/
- http://android-developers.blogspot.de/2009/01/voiding-memory-leaks.html
しかし、それでも私の問題は解決しません。
私のコードは次のとおりです。
public class MyActivity extends Activity {
private Bitmap image;
private ImageView imageView;
private Button button;
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.button = (Button) findViewById(R.id.button);
this.imageView = (ImageView) findViewById(R.id.image);
this.image = BitmapFactory.decodeResource(getResources(), R.drawable.m0);
this.imageView.setImageBitmap(image);
this.button.setOnClickListener(new View.OnClickListener() {
private int current = 0;
@Override
public void onClick(View view) {
Bitmap toRemove = image;
Matrix matrix = new Matrix();
matrix.setRotate(30, 0.5f, 0.5f);
image = Bitmap.createBitmap(image, 0, 0, image.getWidth(), image.getHeight(), matrix, true);
imageView.setImageBitmap(image);
if (toRemove != null) {
toRemove.recycle();
}
}
});
}
}
toRemove.recycle()
削除するイメージで呼び出したことがわかります。でも効果はないようです。
アップデート:
5回目(1回目ではない)にボタンをクリックしたときにのみエラーが発生したため、画像サイズに問題はありません。私のコードでは、新しいイメージを生成した後に古いイメージをリリースしようとしたため、古いイメージが適切にリリースされていないと思います。
を呼び出しtoRemove.recycle()
ました。イメージをリリースする正しい方法ですか? それとも他のものを使用しますか?
最後に:
エミール そうです。サイズをログに記録するコードをいくつか追加しました。毎回増加していることがわかります。
08-28 13:49:21.162: INFO/image size before(2238): 330 x 320
08-28 13:49:21.232: INFO/image size after(2238): 446 x 442
08-28 13:49:31.732: INFO/image size before(2238): 446 x 442
08-28 13:49:31.832: INFO/image size after(2238): 607 x 606
08-28 13:49:34.622: INFO/image size before(2238): 607 x 606
08-28 13:49:34.772: INFO/image size after(2238): 829 x 828
08-28 13:49:37.153: INFO/image size before(2238): 829 x 828
08-28 13:49:37.393: INFO/image size after(2238): 1132 x 1132