5

所以我明白了:

'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]; 
4

3 回答 3

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大小以使其工作或图像。有关采样的更多信息,您可以参考此链接sampleinSampleSize

尝试使用不同的选项。它应该工作。

2) 您还可以通过在文件中使用android:largeHeap="true"manifest属性来增加应用程序的整体堆大小,但这不适用于任何预 Honeycomb 设备。在 2.3 之前的设备上,您可以使用 VMRuntime 类。

3)如果您想以编程方式检测堆大小并希望根据需要更改它,那么您可以点击此链接

于 2013-01-02T04:57:45.783 回答
2

该错误清楚地表明您正在尝试使用更多内存。这直接指向图像大小。因此,您需要调整图像大小以使用更少的内存。出于这个原因可以使用的一个是BitmapFactory.Option。或者手动调整图像大小,注意它是否适合您的所有需求。只是为了说明问题,

堆大小是分配给应用程序执行的内存量。android 应用程序的堆大小由设备 RAM 决定。例如,如果设备的 RAM 为 179 MB,则 android 应用程序只会获得 18MB 的堆大小。

在这里找到更多。有关如何有效加载大型位图的更多信息,请参见此处

我有一个 Galaxy S2,它运行良好,但在 S3 和其他手机上它崩溃了

检查您提到的设备的 RAM 大小。

于 2013-01-02T04:32:24.457 回答
1

在 Android 内存管理中,每个应用程序都有一个可以使用的最大堆内存,一旦应用程序使用的堆内存超过了堆内存,Android 操作系统会自动杀死该应用程序。所以只有你得到“内存不足异常”..

要解决这个问题,您可以使用 Android 的 NDK 概念。因为堆概念是针对 SDK 部分的。

IE,

您可以使用 NDK 使应用程序使用超过 300MB(如果可用)的 RAM,但在 SDK 中是不可能的

于 2013-01-02T04:30:11.687 回答