【问题标题】:java.lang.outofmemoryerror android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)java.lang.outofmemoryerror android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
【发布时间】:2015-03-11 01:08:25
【问题描述】:

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

try{
     setContentView(R.layout.activity_main);

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

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

【问题讨论】:

  • 在activity_main中使用小尺寸/分辨率图像
  • 异常是由于您将非常高分辨率/尺寸的图像加载到 imageview 或在背景中溢出超过允许的内存大小导致 OutofMemoryError
  • 您好 Arslan,请检查您的图片尺寸不是很大,并尽量使用 9Patch 图像。因为它肯定会减少内存消耗。

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


【解决方案1】:

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

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

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

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

  1. 为您的应用增加“heapSize”。这是最后的手段!否则,您将来可能会遇到同样的错误,然后必须使用上述方法之一来解决它……然后您的 QA 真的不会喜欢您!这是heapSize上的参考:

How to increase heap size of an android application?

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

【讨论】:

  • 谢谢它真的很有帮助
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    假设 setContentView 确实是繁重的操作,降低图片的分辨率大小,会解决一段时间,这个问题会在系统的不同地方,不同的时间再次出现。

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

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

    【讨论】:

      猜你喜欢
      • 2014-07-30
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多