Android应用程序崩溃,我无法弄清楚为什么

时间:2012-08-31 17:18:03

标签: android

我有一个非常奇怪的错误。它只发生在模拟器中。我在多款Android手机和Acer平板电脑上进行了测试,它在那里运行良好。

我的程序有一个循环,在Bitmaps中加载到Bitmap[] bitCards。数组按bitCards = new Bitmap[14]设置为14个元素。

现在循环12次,将Bitmap放入数组中,如下所示:

bitCards[i] = BitmapFactory.decodeStream(inputStream);

当i = 8时,它会在此声明中崩溃。

如果我用

替换它
bitCards[0] = BitmapFactory.decodeStream(inputStream);

它没有崩溃,我想也许某种程度上Array不够大所以我做了以下

bitCards[8]=BitmapFactory.decodeStream(inputStream); // Still did not crash.

唯一有意义的是,当我有

bitCards[i] = BitmapFactory.decodeStream(inputStream);

它正在重新启动旧内存并放入一个新对象,因此只创建了一个对象的内存,但......异常没有消失,我不应该得到某种错误吗?

这是我的完整代码:

void Shuffle()
{
    Random generator;
    generator = new Random();
    int[] iCardsUsed;
    iCardsUsed = new int[55];
    for(int i=0;i<55;i++)
    iCardsUsed[i]=0;

    try {   

        bitCards = new Bitmap[14];
        iCards = new int[14];
        iTurnOver = new int[14];

        for (int i = 0; i < 12; i++)
        {
            iTurnOver[i]=0;

            int cardId;

            do {
                cardId = generator.nextInt(50);
            } while( iCardsUsed[cardId] ==1);

            iCardsUsed[cardId] =1;
            iCards[i]=cardId;

            iCards[i]=i;    
            String fName=new String("card");
            fName+=Integer.toString(iCards[i]+1);
            fName+=".jpg";

            AssetManager assetManager= ctx.getAssets();
            InputStream inputStream;
            inputStream = assetManager.open(fName);

            // this is where it crashes
            bitCards[i]=BitmapFactory.decodeStream(inputStream);

            inputStream.close();    
        }

    } catch( IOException e)
    {
        gi++;
    }
    // update screen
    invalidate();
}

1 个答案:

答案 0 :(得分:1)

由于你没有提供任何错误信息,我正在黑暗中拍摄并假设它正在进行OOM。

你说它在运行几次后停止(当i = 8时),我相信你没有释放资源。位图有时会占用大量空间,如果你将它们保存在内存中,如果设备出现OutOfMemory,我也不会感到惊讶。不同的设备对内存有不同的规格,经过几次运行后就会填满内存。

因此,我的建议是使用 mBitmap.recycle() 清除位图,以及用于临时目的的其他存储空间。

另外,请查看this question

相关问题