※このエントリーは続報があります
Androidで大きいサイズのビットマップを扱うその2
Androidで大きいサイズのビットマップを扱うその3
上記の2エントリーも読んでください。
2011/03/10追記


先日から作成しているもとい作成させられている画像を扱うアプリで、元の画像の2.5倍くらいのBitmapを作り画像処理を行う処理を書いてテストしていたところ2.1搭載の実機でout of memory例外が発生して落ちるようになってしまっていた。

環境としては
Android SDK 2.1 update 1で
実機はxperia x10を使用
でっかいBitmapで遊んだあと壁紙を設定したりして、
もういちどでっかいBitmapを取得したら落ちる。

原因としてはHeap食いすぎで、
free()ちゃんとしろよ禿なのだが。

android SDKはjavaだったのでfree()とかないらしい。
とりあえずガベレージを促そうと
bitmap = null;
System.gc();
とかでガベレージさせようとするがやっぱダメ。

探し回っていると海外のフォーラムで
デッカイBitmapで遊んだら、ちゃんとリサイクルに出せよという記事があった。

if(bitmap != null){
bitmap.recycle();
}
これで終了。

ちなみにImgeViewとかdrawbleとか持ってるビューの場合は下記のコードで解放もといリサイクルしてあげるらしい。

Drawable toRecycle = imageView.getDrawable();
if(toRecycle != null){
((BitmapDrawable)toRecycle).getBitmap().recycle();
}

あと再びヒープ領域取得する前にリサイクルできているか調べる場合は
bitmap.is_recycle()で確認できるのでif分でくくってから領域確保すればOKだめなら、エラーメッセージだすとかするらしいよ。

ちなみにこの現象はAndroid 2.2搭載端末ではどの機種でも起きなかった。
ようするAndroid 2.1までのDalvikVMが非常にお馬鹿ということでOKなのか?
まえも2.2では例外にならんところで2.1では例外になったことがある。


もし同じ現象で苦しんでいる人がいたら不要なものはリサイクルへでOKです。