分配变量时Android内存不足

时间:2013-01-02 04:07:39

标签: android memory bitmap

所以我明白了:

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

3 个答案:

答案 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中不可能