gpt4 book ai didi

android - 位图大小超出 VM 预算,不明白为什么

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:34 27 4
gpt4 key购买 nike

我到处寻找“位图大小超出 VM 预算”的问题,但似乎没有一个解决方案适用于我。我不明白为什么我的程序有时会抛出这个错误,因为我使用它的方式似乎不会导致任何可能的内存泄漏。我的堆栈跟踪指向 BitmapFactory.decodeResource() 方法。我有一张背景图片,我用它在 Canvas 上绘制,这就是我初始化它的方式:

Bitmap backgroundImage = BitmapFactory.decodeResource(getResources(),
R.drawable.background);
backgroundImage = resizeImage(backgroundImage, w, h);

这就是我一直在使用它的方式:

canvas.drawBitmap(backgroundImage, 0, 0, paint);

我认为将 backgroundImage = null 放在 onDestroy 方法中会有所帮助,但这没有任何作用。除了 XML 文件外,我的程序中没有其他对背景图像资源的引用,但我认为这不会影响它。有人可以向我解释为什么会发生这种情况以及如何解决吗?

顺便说一句,此应用程序不涉及屏幕方向更改。

最佳答案

完成后需要释放位图像素。您提到您将其值设置为 null,但这只会使其符合 GC 条件,它不会明确告诉 VM 您已完成这些像素,并且现在是释放他们的好时机。

在将其设置为 null 之前,只需调用 Bitmap#recycle()在位图上:

protected void onDestroy() {
if (this.backgroundImage != null) {
this.backgroundImage.recycle();
this.backgroundImage = null;
}
}

此外,您可能在没有提供代码的 resizeImage() 方法中浪费资源。在解码时对位图进行适当的下采样比加载全尺寸位图然后从那里缩小它要更有效率

一般技术是使用 3-argument version BitmapFactory.decodeResource(),带BitmapFactory.Options#inJustDecodeBounds第一次通过以获得位图的宽度/高度(尽管在你的情况下,因为它来自应用程序的资源,所以你甚至没有理由必须这样做......但我会解释它反正);然后确定一个合适的 samplesize根据目标大小,对位图进行二次解码。这通常会导致更少的内存使用,特别是对于非常大的图像(例如,将 inSampleSize 设置为 2,它解码全尺寸位图,但仅为原始尺寸一半的位图分配足够的内存大小,在此过程中缩小位图)。

关于android - 位图大小超出 VM 预算,不明白为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6337612/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com