0

非常に奇妙なバグがあります。これはエミュレーターでのみ発生します。複数のAndroidフォンとAcerTabletでテストしましたが、そこでは正常に動作します。

私のプログラムには、ビットマップをにロードするループがありますBitmap[] bitCards。配列は、によって14要素に設定されbitCards = new Bitmap[14]ます。

これで、12回ループして、次のようにビットマップを配列に配置します。

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

i = 8の場合、このステートメントでクラッシュします。

私がそれを置き換える場合

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

クラッシュしません。どういうわけかアレイの大きさが足りないと思ったので、次のようにしました。

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

理にかなっている唯一のことは、

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

古いメモリを解放して新しいオブジェクトを挿入しているため、1つのオブジェクトのメモリのみが作成されますが、例外は発生しません。何らかのエラーが発生するのではないでしょうか。

これが私の完全なコードです:

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();
}
4

1 に答える 1

1

エラーメッセージが表示されていないので、暗闇の中で撮影しており、OOM になっていると想定しています。

数回実行した後(i = 8の場合)停止するとおっしゃっていますが、リソースを解放していないと思います。ビットマップはときどき多くのスペースを占有することがあります。ビットマップをメモリに保持している場合、デバイスが OutOfMemory になっても驚かないでしょう。デバイスによってメモリの仕様が異なり、数回実行するとメモリがいっぱいになります。

mBitmap.recycle()したがって、私の提案は、一時的な目的で使用しているビットマップとその他のストレージを使用してクリアすることです。

また、この質問を見てください!

于 2012-08-31T17:26:24.757 に答える