所以我明白了:
'01-01 20:37:34.859: E/dalvikvm-heap(19921): Out of memory on a 6471856-byte allocation.'
尝试将一堆变量分配给内存时。 我正在分配24个这样的变量:
mElements.add(new ShopElement(getResources(),R.drawable.shop_starter, b1X , b1Y,true,1,"red",true,5,checkLocked(0)));
其中一个:
bNumbers = new Bitmap[] {Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h0)
, 65,65, true),
Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h1)
, 65,65, true),
Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h2)
, 65,65, true),
Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h3)
, 65,65, true),
Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h4)
,65,65,true),
Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h5)
, 65,65, true),
Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h6)
, 65,65, true),
Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h7)
, 65,65, true),
Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h8)
, 65,65, true),
Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h9)
, 65,65, true),
Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.time)
, 50,50, true)};
但是在我能够完成我创建的24个元素中的第16个之前,它会在某些手机上崩溃。
我有一个 Galaxy S2 ,它运行正常,但在 S3 和其他手机上它会崩溃。
我很乐意根据要求提供更多信息。
我之前搜索过此错误,尝试应用解决方案,并查看“有效显示位图”的事情,但似乎没有任何帮助。
我的头脑是什么旋转它在S2上工作,而不是S3。 S3不应该以各种方式超过S2吗?
我使用全局BitmapFactory.Options绘制我的所有位图我按如下方式设置选项:
Global.opts = new BitmapFactory.Options();
Global.opts.inDither=false;
Global.opts.inPurgeable=true;
Global.opts.inInputShareable=true;
Global.opts.inTempStorage=new byte[16 * 1024];
答案 0 :(得分:8)
只是你想要获得更多的内存。所以解决方案是增加内存或仅使用可用内存。
有三个建议。
1)如果您使用BitmapFactory.Options
并且仍然存在错误,则表示您没有对给定图像使用正确的配置。 只需确保堆大小足够。
BitmapFactory.Options opts=new BitmapFactory.Options();
opts.inDither=false; //Disable Dithering mode
opts.inSampleSize = 8; // scale image upto 1/8 of the original image.
opts.inPurgeable=true; //Tell to gc that whether it needs free memory, the Bitmap can be cleared
opts.inInputShareable=true; //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
opts.inTempStorage=new byte[16 * 1024]; //you can increase this value as per your need.
您可以使用inTempStorage
属性增加sample
尺寸以使其有效或inSampleSize
图像。有关抽样的更多信息,请参阅此link。
尝试使用不同的选项。它应该工作。
2)您还可以使用manifest
文件中的android:largeHeap="true"属性来增加App的整体堆大小,但这不适用于任何预装Honeycomb设备。在2.3之前的设备上,您可以使用VMRuntime类。
3)如果您想以编程方式检测堆大小并希望根据需要进行更改,则可以按照link进行操作。
答案 1 :(得分:2)
错误清楚地表明您正在尝试使用更多内存。这直接指向图像大小。因此,您需要调整图像大小以使用较少的内存。可以用于此原因的是BitmapFactory.Option。或者手动调整图像大小,注意它可以满足您的所有需求。只是为了解释事情,
堆大小是分配给应用程序的内存量 执行。 Android应用程序的堆大小由设备决定 内存。例如,如果设备具有179 MB的RAM,则为android 应用程序只能获得18MB的堆大小。
更多地了解here。更多关于如何有效加载大位图的信息here。
我有一个Galaxy S2,它运行正常,但在S3和其他手机上它 崩溃
检查您提到的设备的RAM大小。
答案 2 :(得分:1)
在Android内存管理中,每个应用都有一个最大堆内存它可以使用,一旦应用程序使用超过堆内存,Android操作系统将自动杀死应用程序。所以只有你得到“Out of Memory Exception”..
要解决此问题,您可以选择 Android的NDK概念 ..因为堆概念适用于SDK部分..
即,
你可以让一个应用程序使用NDK使用超过300MB(如果可用)的RAM但在SDK中不可能