我有一个例程,它操纵一个Bitmap将RGB格式转换为灰度。
它通常工作正常,但是当我尝试在大小为1088kb的Bitmap上使用它时,它会给我这个错误:
java.lang.OutOfMemoryError
我正在使用模拟器。 1088kb不是一幅很大的画面,怎么会耗尽内存呢?
确切地说,调用有问题代码的应用程序包括后备堆栈上的另一个Activity,它具有ListView的图片缩略图。
这是方法:
public Bitmap toGrayscale(Bitmap bmpOriginal)
{
int width, height;
height = bmpOriginal.getHeight();
width = bmpOriginal.getWidth();
Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
Canvas c = new Canvas(bmpGrayscale);
Paint paint = new Paint();
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(0);
ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
paint.setColorFilter(f);
c.drawBitmap(bmpOriginal, 0, 0, paint);
return bmpGrayscale;
}
答案 0 :(得分:3)
你在管理内存中的位图时效率非常低,而且你可能有内存泄漏(当你完成它们或者在没有收集垃圾的活动中保留它们时,不会从内存中释放位图)。 Android开发人员有一个正确的位图管理页面:
http://developer.android.com/training/displaying-bitmaps/index.html
您可以尝试在模拟器上增加堆大小。
Out of memory error on android emulator, but not on device
监控模拟器上的堆大小:
https://stackoverflow.com/a/7427803/445131
摆脱内存泄漏:
What Android tools and methods work best to find memory/resource leaks?