【发布时间】:2011-09-14 07:43:49
【问题描述】:
我到处寻找“位图大小超出 VM 预算”的问题,但似乎没有一个解决方案适合我。我不明白为什么我的程序有时会抛出此错误,因为我使用它的方式似乎不会导致任何可能的内存泄漏。我的堆栈跟踪指向 BitmapFactory.decodeResource() 方法。我有一个背景图像,我用它在画布上绘制,这就是我初始化它的方式:
Bitmap backgroundImage = BitmapFactory.decodeResource(getResources(),
R.drawable.background);
backgroundImage = resizeImage(backgroundImage, w, h);
这就是我一直在使用它的方式:
canvas.drawBitmap(backgroundImage, 0, 0, paint);
我认为将backgroundImage = null 放在 onDestroy 方法中会有所帮助,但这并没有起到任何作用。除了 XML 文件外,我的程序中没有其他对背景图像资源的引用,但我认为这不会影响它。有人可以向我解释为什么会发生这种情况以及如何解决吗?
顺便说一句,这个应用程序不涉及屏幕方向更改。
【问题讨论】:
-
你有一个字段和一个名为
backgroundImage的局部变量吗?您可以在 Eclipse 中轻松检查这一点,方法是转到 Window > Preferences,然后导航到 Java > Compiler > Errors/Warnings 并将“Local variable declarations hides another field or variable”设置为 Warning。 -
不,类中只有一个 backgroundImage,它是一个私有类变量。
-
只是这段代码:
Bitmap backgroundImage = BitmapFactory....看起来像是一个局部变量声明。 -
您多久调用一次此代码?您可能会因为一遍又一遍地将相同的图像加载到内存中而耗尽内存,而 GC 无法跟上。如果您调用它的频率足够高并且图像永远不会改变.. 考虑将 backgroundImage 设为一个字段。
-
对不起,我让它看起来像一个局部变量只是为了显示类型;但在实际程序中,它是一个类变量。我不认为这会影响它,不是吗?
标签: android memory bitmap memory-leaks