每隔一段时间,我就会收到一个如下所示的应用程序崩溃报告:
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)
到目前为止,我无法重现此问题,也没有关于发生此问题的设备的信息。
“位图大小=31040KB”究竟是什么意思?我的应用程序真的在尝试创建 30MB 位图吗?我正在为自定义 SeekBar 组件创建一个背景图像,该组件应该具有相同的视图大小(9-patch 不适合我的用例)。这是产生错误的 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 ......任何想法可能有什么问题?