-3

アセットまたは SD カードからビットマップをロードすることになっているこのコードを書きました。通常、ビットマップは大きすぎず、 <1mb 、 1280x800 ですが、OutOfMemoryError: ビットマップ サイズが VM の予算を超えているというエラーがスローされることがありますが、再度リロードしようとすると、ほとんどの場合正常にロードされます。

ここで何が間違っているのでしょうか?

ありがとう!:)

                try
    {

    GirlBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.girl);
    GirlBitmapBG = BitmapFactory.decodeResource(getResources(), R.drawable.bg);


                if ( ForeNameSource.equals("ass") )
                {
                    try {
                        InputStream ims = getAssets().open( "girls" +"/"+ ForeName );
                        GirlBitmap = BitmapFactory.decodeStream(ims);
                    } catch (IOException e) { e.printStackTrace(); }
                }
                else
                {
                    GirlBitmap = BitmapFactory.decodeFile(ForeName);
                }


                if ( BgNameSource.equals("ass") )
                {
                    try {
                        InputStream imsBg = getAssets().open( "girls" +"/"+ BgName );
                        GirlBitmapBG = BitmapFactory.decodeStream(imsBg);
                    } catch (IOException e) { e.printStackTrace(); }
                }
                else
                {
                    GirlBitmapBG = BitmapFactory.decodeFile(BgName);
                }
    }
    catch(OutOfMemoryError e){
      Log.e("out of memory","too big!");  /// sometimes crashes here.
      Toast.makeText(this, "Bitmap too big!", 1500).show();
    }


    if ( ReSize )
    {
    WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();


    float ReSizeCoofGirl =  (float)display.getHeight() / (float)GirlBitmap.getHeight();
    if ( ReSizeCoofGirl > 1 ) { ReSizeCoofGirl = 1; }

    float ReSizeCoofBG =  (float)display.getHeight() / (float)GirlBitmapBG.getHeight();
    if ( ReSizeCoofBG > 1 ) { ReSizeCoofBG = 1; }

    // also sometimes crash comes from the line below.
    GirlBitmap = Bitmap.createScaledBitmap(GirlBitmap, (int) (GirlBitmap.getWidth()*ReSizeCoofGirl), (int) (GirlBitmap.getHeight()*ReSizeCoofGirl), false);
    GirlBitmapBG = Bitmap.createScaledBitmap(GirlBitmapBG, (int) (GirlBitmapBG.getWidth()*ReSizeCoofBG), (int) (GirlBitmapBG.getHeight()*ReSizeCoofBG), false);
    }

    drawView.invalidate();
}
4

1 に答える 1

2

開発者サイトに追加されたこの新しいリソースを参照してください: http://developer.android.com/training/displaying-bitmaps/index.html (画面の右側にあるサンプル プロジェクトを確認してください)

于 2012-04-26T10:02:02.397 に答える