[Android]画像を扱った時にOutOfMemoryに悩まされる

しばらーく投稿をしていませんでしたが、「ひらがなかこう」を作ってまして、いろいろ難航しました。一番の難航は3.0系や4.0系では、比較的、落ちにくいんですが、2.0(2.2以降)台だと、ちょっとbitmapを扱うと、すぐOutOfMemoryでクラッシュします。まぁ、いろいろ調べると2.2系に対応するのであれば、特にbitmapやViewにセットした画像をクリーンアップしないと、すぐメモリ不足だと怒られてしまいます。以下に、ある程度の解決策をメモとして残します。

(1)bitmapは使わなくなったらすぐリサイクル

(2)bitmapを読み込むときはConfig.ARGB_4444(or  RGB_565)を使う。ひらがなかこうはレイヤーで書き順描画しているのでアルファが必要なためARGB_4444を使う。

(3)inSampleSizeで読み込みサイズをダウン。2にすると面積比1/4になる。けど粗くなる・・・


BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Config.ARGB_4444;
options.inPurgeable=true;
options.inSampleSize=2;
Bitmap bitmap_lay2 = BitmapFactory.decodeResource(getResources(),getResources().getIdentifier(bmp_res_array[now_count], "drawable", "jp.co.sakai.write_hiragana"),options);
bitmap_lay = bitmap_lay2.copy(Bitmap.Config.ARGB_4444, true);
bitmap_lay2.recycle();
bitmap_lay2 = null;

あと、ScrollViewからの画面遷移時にOutOfMemoryがでまくった。これはScrollViewをクリーンナップすることででなくなった。

public static final void cleanupView(View view) {
if(view instanceof ImageButton) {
ImageButton ib = (ImageButton)view;
ib.setImageDrawable(null);
} else if(view instanceof ImageView) {
ImageView iv = (ImageView)view;
iv.setImageDrawable(null);
} else if(view instanceof SeekBar) {
SeekBar sb = (SeekBar)view;
sb.setProgressDrawable(null);
sb.setThumb(null);
}
view.setBackgroundDrawable(null);
if(view instanceof ViewGroup) {
ViewGroup vg = (ViewGroup)view;
int size = vg.getChildCount();
for(int i = 0; i < size; i++) {
cleanupView(vg.getChildAt(i));
} }

}

画面遷移する前に、ScrollViewの位置のみを保持して、DrawableなViewを上の手続きで処理すればメモリー不足に陥ることはなくなった。が、いろいろ使ってみないとわからないし、手元に2.2系の実機がないのでエミュレーターのみのチェックとなってしまい、少々不安。。。こんなことなら、スマホは2.3のままにしとけばよかった・・・。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください