【问题标题】:Android Emulator: java.lang.OutOfMemoryError when manipulating a BitmapAndroid 模拟器:操作位图时出现 java.lang.OutOfMemoryError
【发布时间】:2013-01-30 10:11:54
【问题描述】:

我有一个例程操作位图以将 RGB 转换为灰度。

它通常工作正常,但是当我尝试在大小为 1088kb 的位图上使用它时,它给了我这个错误:

java.lang.OutOfMemoryError

我正在使用模拟器。 1088kb不是很大的图,怎么会耗尽内存呢?

确切地说,调用有问题代码的应用程序在后台堆栈中包含另一个 Activity,该 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;
}

【问题讨论】:

  • 位图大小是 1088 kB 还是 PNG 文件?
  • 不使用的时候需要.recycle() 位图,或许可以回收“原件”并在内存中保留灰度
  • @PaNaVTEC 请问我该怎么做?只需在 Bitmap 上调用 recycle()?谢谢!!!!

标签: android out-of-memory image


【解决方案1】:

您在内存中管理位图的效率非常低,并且您可能存在内存泄漏(当您使用完位图时没有从内存中释放位图,或者将它们保留在没有进行垃圾收集的活动中)。 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?

【讨论】:

    猜你喜欢
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 2010-12-29
    相关资源
    最近更新 更多