android - 位图大小超出了 Android 上的 VM 预算错误

标签 android image memory memory-leaks

我正在将 100 张图片从 Asset 文件夹加载到一个数组对象中。图片非常小(每张 png ~20k),我使用这段代码来处理它,以防止内存泄漏和优化性能:

在循环中:

// create resized bitmap from asset resource
        InputStream istr = assetManager.open(pics[i]);
        Bitmap b = BitmapFactory.decodeStream(istr);
        b = Bitmap.createScaledBitmap(b, 240, 240, true);

其中 pics[i] 是我的 Assets 文件夹中的文件名列表。

该代码适用于我,但我仍然不时收到用户的错误(我在开发者控制台错误中看到):

java.lang.OutOfMemoryError: bitmap size exceeds VM budget
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:468)
at android.graphics.Bitmap.createBitmap(Bitmap.java:435)
at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:340)

我可以做些什么来改进它吗?或者这就是 Android 的世界,我们永远无法交付完美的应用程序?

最佳答案

当然你可以改进一些东西:不要同时将太多图片加载到内存中(或减小它们的大小)。有些设备没有太多可用内存。您的设备可能比您的某些客户手机具有更高的堆限制。因此,当它为您工作时,它会为他们崩溃(请参阅 this video 了解一些堆限制 [在 4:44])。

您可以通过 ActivityManager.getMemoryClass() 获得可用的堆大小.

要改进这一点,请测试您现在需要哪些图片(已显示)哪些不需要。仅加载所需的位图并回收您不再需要的位图。

也尝试使用 BitmapFactory.decodeResource()BitmapFactory.Options.inSampleSize。这使您可以直接以较低分辨率加载图像,而无需像此处那样以完整尺寸加载它们,然后调整它们的大小。

关于android - 位图大小超出了 Android 上的 VM 预算错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7108169/

相关文章:

java - 我正在使用带有 API 15 的 Android 手机作为测试设备。我尝试运行此应用程序,但它在加载后立即停止在我的设备上运行

java - 发送海量数据——java解决方案

android - ConstraintLayout 内的 ImageView 不起作用

javascript - 如何使用 javascript 将图像数组显示为列表并使其可单击以显示一些文本?

Android Studio焦点-切换到ClassFile

python - 在python中调整图像大小

javascript - JSON 解析 - 内存依赖?

android - 应用程序相机崩溃

java - 为什么这个java进程不释放内存?

c++ - 垂直翻转Char数组: is there a more efficient way?