2016-02-02 84 views
2

我正在使用vectordrawable来显示图像。这些图像是与应用程序捆绑在一起的所有资源(apk)。我的问题是,每一个新活动的内存都会大量增加,直到应用程序崩溃并出现OutOffMemoryException。OutOfMemory异常Android VectorBitmap

java.lang.OutOfMemoryError 
    at android.graphics.Bitmap.nativeCreate(Native Method) 
    at android.graphics.Bitmap.createBitmap(Bitmap.java:903) 
    at android.graphics.Bitmap.createBitmap(Bitmap.java:880) 
    at android.graphics.Bitmap.createBitmap(Bitmap.java:847) 

我看着MAT内存泄漏,但did'nt找出任何比位图的错误更多。

什么是有效的方法来显示vectordrawables?也许我的应用程序的一般体系结构不适用于活动生命周期?

我没有找到关于其他应用程序(facebook,aibnb,whatsapp,...)的公共内存ussage的任何信息。我的用法大约是40-70MB。

+0

您可以添加一些内容来描述应用程序的一般体系结构,以及如何在活动之间切换? –

+0

转换是由intents“startActivity”进行的。就像这里所描述的那样http://developer.android.com/training/basics/firstapp/starting-activity.html 一般的体系结构是由一个抽象的基类构成的,用于所有常见的函数/属性。所有其他应该是正常和标准的。 – dothem

回答

1

有一些事情要小心使用的图片的时候:

  1. 你每次加载您的图像,当你告诉他们?这可能是一个非常耗费内存的操作。最好将图像加载到内存中,然后在整个应用程序中重新使用它们。
  2. 你是否正在清理不再使用的图像占用的内存?如果您确定不再需要图像,则应通过调用bitmap.recycle()来清除分配的位图内存。这会使位图无效并释放所有占用的内存,使其可用于其他操作。
  3. 图像是否太大?单张图像的最大尺寸有限制。尝试加载更大的图像也会导致OutOfMemoryError,即使内存可用。在这种情况下,您可能需要优化您尝试加载的图像文件。

去你的应用程序,并逐一检查这些潜在的问题。此外,Android平台还有很好的分析工具。他们可以告诉你内存管理的潜在问题,如内存过度分配等。

祝你好运。

+0

1.你是什么意思加载?我已经在xml布局中声明了最多的图像。或者在很多情况下使用“setImageResource”。我看到有几篇关于缓存的文章。也许这是我必须检查的事情。 2.这会很难。如果有很多图片,我必须为每张图片都做到这一点。也许我必须声明一个ID数组?关于恢复什么?销毁是否会回收图像内存?因此,流程将设置为缓存创建/恢复。并暂停回收,摧毁? 3. imagefiles没有任何大小,因为它们是vectordrwables(XML/SVG)。 – dothem

+0

我以为你自己正在加载图像并做一些绘图。如果您按照自己的方式使用它们,则应该尝试调查导致这些位图创建的原因,以及这是否是主要问题。至于第2点,在你的情况下,这应该由Android平台管理。我在谈论内存大小,不仅仅是宽度和高度。 –