しばらーく投稿をしていませんでしたが、「ひらがなかこう」を作ってまして、いろいろ難航しました。一番の難航は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になる。けど粗くなる・・・
1 2 3 4 5 6 7 8 9 10 11 12 |
[js highlight="2,4,10"] 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; [/js] |
あと、ScrollViewからの画面遷移時にOutOfMemoryがでまくった。これはScrollViewをクリーンナップすることででなくなった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
[js] 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)); } } } [/js] |
画面遷移する前に、ScrollViewの位置のみを保持して、DrawableなViewを上の手続きで処理すればメモリー不足に陥ることはなくなった。が、いろいろ使ってみないとわからないし、手元に2.2系の実機がないのでエミュレーターのみのチェックとなってしまい、少々不安。。。こんなことなら、スマホは2.3のままにしとけばよかった・・・。