在设置内容视图时,我遇到了这个异常。 我已经尝试通过以下方式处理此异常:
try{
setContentView(R.layout.activity_main);
}catch (OutOfMemoryError e) {
e.printStackTrace();
}
这个例外在测试时大约有100个时间中的5个。但我无法解决这个问题。或者我的QA团队会在这个上杀了我:(
答案 0 :(得分:11)
有几种方法可以解决此类错误。通常是因为您的图像分辨率在布局上太高。您可以选择以下选项:
要求分辨率较低的图像(较少像素)。这可能是不可接受的,但你的团队应该意识到内存限制。
从布局中删除图像,但保留ImageView
元素(如果有)。如果是背景,请删除背景。然后使用java有效地加载图像。在加载之前,您需要测量想要图像的元素的屏幕尺寸和/或尺寸。 Android文档在这里有一个很好的例子:
http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
heapSize
: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。