java.lang.outofmemoryerror android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)

时间:2015-01-13 06:19:48

标签: java android exception bitmap out-of-memory

在设置内容视图时,我遇到了这个异常。 我已经尝试通过以下方式处理此异常:

try{
     setContentView(R.layout.activity_main);

}catch (OutOfMemoryError e) {
        e.printStackTrace();
    }

这个例外在测试时大约有100个时间中的5个。但我无法解决这个问题。或者我的QA团队会在这个上杀了我:(

3 个答案:

答案 0 :(得分:11)

有几种方法可以解决此类错误。通常是因为您的图像分辨率在布局上太高。您可以选择以下选项:

  1. 要求分辨率较低的图像(较少像素)。这可能是不可接受的,但你的团队应该意识到内存限制。

  2. 从布局中删除图像,但保留ImageView元素(如果有)。如果是背景,请删除背景。然后使用java有效地加载图像。在加载之前,您需要测量想要图像的元素的屏幕尺寸和/或尺寸。 Android文档在这里有一个很好的例子:

  3. http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

    1. 增加应用的“heapSize”。这是一个最后的度假村!否则,您将来可能会遇到同样的错误,然后必须使用上述方法之一来解决它...而且您的QA真的不会喜欢你!以下是heapSize
    2. 的参考资料

      How to increase heap size of an android application?

      您也可能在另一个屏幕上引用图像或者有内存泄漏,在这种情况下,您需要查看在此之前调用的任何/所有代码(包括其他活动)以查找这些泄漏的位置。可能的原因是将Activity传递给后台线程或服务而不是仅传递它的Context,创建对图像的静态引用,而不是使用WeakReference来处理传递给其他线程/进程的大内存对象,或其他不寻常的方法来引用对象。

答案 1 :(得分:2)

正如其他人所说,这种情况正在发生,因为应用程序存在内存泄漏或您的应用程序使用了太多内存。

首先尝试减少布局文件中的图层数量,这很可能会解决问题。如果这不安装MAT插件,使用它可以检查应用程序在运行时使用的内存量。在您的活动未释放内存或视图未在列表/网格中正确回收之前,可能会打开先前的活动

PS:减少布局文件中可能最有效的层数

答案 2 :(得分:1)

提供的代码不一定是OutOfMemoryError的原因。 OutOfMemory的主要原因是JVM GC无法释放足够的内存以使您的操作继续进行。

假设setContentView确实是繁重的操作,并且降低了图像的分辨率大小,可以解决它一段时间,这个问题会在不同的时间重新出现在系统的不同位置。

你可以谷歌GC无法分配足够空间的原因,通常这意味着你的代码中有一些陈旧的引用,你需要清理它,以帮助你的GC。

我建议您为应用程序使用分析器,以跟踪应用程序中空间的分配和清除方式。默认情况下,你有标准的一个用android。