在某些设备中,位图的大小超过了虚拟机的预算。

23 浏览
0 Comments

在某些设备中,位图的大小超过了虚拟机的预算。

我正在做一个Android应用程序,使用一台内存为3GB的设备运行良好,但在一台内存为512MB的设备上运行不佳。我遇到了一个错误\"bitmap size exceeds VM budget\",我不知道该如何解决。这是我的布局代码,其中使用了许多可绘制对象。我尝试了其他问题中提到的方法,但是仍然无法解决问题。\n@Override\nprotected void onDestroy() {\n super.onDestroy();\n unbindDrawables(findViewById(R.id.RootView));\n System.gc();\n}\nprivate void unbindDrawables(View view) {\n if (view.getBackground() != null) {\n view.getBackground().setCallback(null);\n }\n if (view instanceof ViewGroup) {\n for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {\n unbindDrawables(((ViewGroup) view).getChildAt(i));\n }\n ((ViewGroup) view).removeAllViews();\n }\n}

0
0 Comments

增加堆大小

AndroidManifest.xml中,在Application标签中添加android:largeHeap=“true”属性。

“largeHeap”属性仅在API级别11及更高版本中使用(当前最低版本为8),我使用的是8。

0
0 Comments

在一些设备上出现了“bitmap size exceeds VM budget”的问题。这个问题的原因可能是由于使用了过大的Bitmap对象导致内存超出了设备的虚拟机内存限制。为了解决这个问题,可以采取以下措施:

1. 对于处理Bitmap对象:

BitmapFactory.Options options=new BitmapFactory.Options();
options.inSampleSize = 8;
options.inDither = false;
options.inPurgeable = true;
options.inInputShareable = true;
Bitmap bitmap = BitmapFactory.decodeStream(is, null, options);

在将Bitmap实例设置为null之前,使用`bitmap.recycle()`方法释放内存。

2. 对于处理res/drawable中的图片:

- 在项目的清单文件中的application标签中添加`android:largeHeap=“true”`属性。

- 使用图形编辑器调整图片的大小和尺寸,减小图片的大小。

需要注意的是,有人认为这个错误只会在logcat中显示,不会影响应用程序,这是完全错误的。OutOfMemoryError是Java中的一个Error,比RuntimeException更为严重,会使应用程序崩溃。

此外,需要注意android:largeHeap属性只适用于API级别11及以上的设备。如果当前的最小API级别是8,则无法使用该属性。可以尝试使用其他方法来避免这个错误。

,解决“bitmap size exceeds VM budget”的问题,可以通过调整Bitmap的参数和释放内存的方式来减小内存占用,同时可以通过调整图片的大小和尺寸来减小图片的内存占用。

0
0 Comments

在某些设备上出现了“bitmap size exceeds VM budget”问题,即位图大小超过了虚拟机(VM)的内存限制。这个问题的出现原因是图片的内存占用过大,超过了设备的内存容量。为了解决这个问题,可以对位图进行压缩处理。

以下是一种解决方法,可以在显示位图时对位图进行压缩:

image.buildDrawingCache();
Bitmap img = image.getDrawingCache();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
img.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] food = stream.toByteArray();

在显示位图之前,将位图进行压缩处理,并将压缩后的位图保存在一个字节数组中。这样可以减小位图的内存占用。

另外,还可以使用以下代码获取要显示的位图,并对其进行压缩处理:

Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();

通过以上解决方法,可以有效地解决“bitmap size exceeds VM budget”问题,避免因位图内存占用过大而导致的内存溢出问题。

0