非常に奇妙なバグがあります。これはエミュレーターでのみ発生します。複数の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();
}