2012.07.05

本書のサンプルにおいて、java.lang.OutOfMemoryErrorが発生する問題について

Android対応マスコットアプリプログラミング

本書のサンプルを実行する際に、java.lang.OutOfMemoryErrorなどのエラーが発生する場合があります。これは、サイズの大きな画像を読み込む際のメモリ不足によるものと考えられます。
メモリ不足が発生するサンプルにおいては、画像の読み込みを行う処理(getBitmapメソッド)を下記のように修正してください。該当サンプルは「Animation」「Bitmap3」「Input」「Mascot」「Sound」「Text」です。

——————————————————————
Bitmap getBitmap(int i, int j, int k) {
  String s[]={“body”, “eye”, “mouth”};
  if (bitmap[i][j][k]==null) {
    Resources r=getContext().getResources();
    
    // 画像生成時のオプションを作成
    BitmapFactory.Options options=new BitmapFactory.Options();
    
    // メモリが不足したときに画像を解放できるようにする
    options.inPurgeable=true;
    
    // 上記の対策をしてもエラーが起きる場合には、
    // 下記のオプションも設定して画像を縮小する。
    // 例えば2を設定すれば縦横のピクセル数が各々1/2になる
    // options.inSampleSize=2;
    
    // オプションを設定して画像を生成
    bitmap[i][j][k]=BitmapFactory.decodeResource(
      r, r.getIdentifier(“pose”+i+s[j]+k, “drawable”,
        getContext().getPackageName()), options);
  }
  return bitmap[i][j][k];
}
——————————————————————

 「Bitmap2」サンプルは下記のように修正してください。

——————————————————————
public BitmapView(Context c) {
  super(c);
  Resources r=c.getResources();
  BitmapFactory.Options options=new BitmapFactory.Options();
  options.inPurgeable=true;
  bitmap[0]=BitmapFactory.decodeResource(r, R.drawable.pose0body0, options);
  bitmap[1]=BitmapFactory.decodeResource(r, R.drawable.pose0eye0, options);
  bitmap[2]=BitmapFactory.decodeResource(r, R.drawable.pose0mouth0, options);
}
——————————————————————

 なお、修正版のサンプルは、下記のリンクからダウンロード可能です。

修正版サンプル