0

時々、次のようなアプリのクラッシュ レポートを受け取ります。

java.lang.OutOfMemoryError: bitmap size exceeds VM budget(Heap Size=18119KB, Allocated=15536KB, Bitmap Size=31040KB)
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:695)
at myPackage.MyApp.MyView.onSizeChanged(MyView.java:46)

これまでのところ、この問題を再現できず、この問題が発生するデバイスに関する情報もありません。

「Bitmap Size=31040KB」とは正確にはどういう意味ですか? 私のアプリは本当に 30MB のビットマップを作成しようとしていますか? ビューと同じサイズにする必要があるカスタム SeekBar コンポーネントの背景画像を作成しています (9 パッチは私のユースケースには適していません)。エラーを生成する SeekBar のオーバーライドされたメソッドは次のとおりです。

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    if (w <= 0 || h <= 0)
        return;

    LayerDrawable ld = (LayerDrawable)getContext().getResources().getDrawable(R.drawable.colorpicker);

    Bitmap output = Bitmap.createBitmap(w,
                h, Config.ARGB_8888);

    // code that draws the image, left that out here

    BitmapDrawable bmD = new BitmapDrawable(output);
    ld.setDrawableByLayerId(android.R.id.background, bmD);
    setProgressDrawable(ld);

    super.onSizeChanged(w, h, oldw, oldh);
}

行 46 は、ビットマップが作成される行です。ビューは画面全体に広がり、SeekBar のデフォルトの高さを持っているため、最悪の場合、ビットマップには約 80KB が必要になるはずです...何が間違っているのでしょうか?

4

1 に答える 1

0

サイズ ビットマップの幅*高さ*4 = サイズ。役立つかもしれません:ビットマップを描画 してみてください これはコードです。

for(int i=0; i<5; i++){
try{
   Bitmap output = Bitmap.createBitmap(w,
                h, Config.ARGB_8888);     
   break;
}catch(OutOfMemmoryException e){
  e.printStackTrace();
   w -=50;
   h -=50;//or another numbers;
}
}
于 2012-09-13T11:58:35.970 に答える