java.lang.outofmemoryerror android.graphics.BitmapFactory.na



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

try{
     setContentView(R.layout.activity_main);
}catch (OutOfMemoryError e) {
        e.printStackTrace();
    }

测试时,大约 100 次中有 5 次出现此异常。 但我无法解决这个问题。否则我的QA团队会在这个:(上杀了我

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

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

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

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

  1. 增加应用的"堆大小"。这是最后的手段!否则,您将来可能会遇到相同的错误,然后必须使用上述方法之一来解决它......到时候你的QA真的不会喜欢你!以下是heapSize的参考:

如何增加安卓应用程序的堆大小?

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

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

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

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

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

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

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

我建议为您的应用程序使用探查器,以跟踪应用程序中空间的分配和清除方式。默认情况下,您有标准的安卓设备。

最新更新