私は自分のゲームでブラウザレベルにActivityを持っています。このアクティビティでは、一度にHorizontalScrollViewerに25レベルを表示させます。レベルはカスタムコンポーネントであるLevelBrowserButtonsで表されます。各LevelBrowserButtonはレベルのイメージで、これらのイメージはそれほど大きくなく、35Kを超えることはありません。Android Image Memoryの問題
25ボタンの場合、イメージに1MBを超えるはずはありませんが、VMヒープサイズが24の場合でも、「java.lang.OutOfMemoryError:ビットマップサイズがVMの予算を超えています」というメッセージが表示されます。
私のコードは以下の通りです:私は、問題の同じ種類を持つ人々のスレッドのかなりを読みましたが、それを把握することができませんでした
public class LevelBrowserButton extends LinearLayout
{
int LayoutNumber = 1;
public LevelBrowserButton(Context context, String layoutName, int layoutNumber)
{
super(context);
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.levelbrowser_button, this);
LayoutNumber = layoutNumber;
// Set Layout Name
TextView nameTextView = (TextView) findViewById(R.id.NameTextView);
nameTextView.setText(layoutNumber + ": " + layoutName);
// Set Layout Image
int imageResource = this.getResources().getIdentifier("levelbrowser_" + layoutNumber, "drawable", "mobile.firegame");
ImageView backgroundImageView = (ImageView)findViewById(R.id.BoardImageView);
backgroundImageView.setImageResource(imageResource);
// Set Status Image
ImageView statusImageView = (ImageView)findViewById(R.id.StatusImageView);
if (Settings.getLevelStats(layoutName).Completed)
statusImageView.setImageResource(R.drawable.levelbrowser_completed);
else
statusImageView.setImageResource(R.drawable.levelbrowser_uncompleted);
}
}
。これは、ビットマップを適切に処分することとは関係ありません。なぜなら、私はこれまでにもそれを実現することはできませんでした。
イメージの解像度(px * px)を教えてください。いくつかの圧縮ファイル形式が35KBであるという事実は、ビットマップの実際のメモリ要件についてはほとんど言及していません。 –
これは350x300です。 – Moresby
ビットマップの価値は350 * 300 * 3 * 8 * 25(w * h * rbg * byte * images)バイト、つまり60 MBです。画面サイズによっては、2より多く表示することはできませんそれらのうちの3つはいつでも、あなたは考慮する必要がありますhttp://stackoverflow.com/questions/541966/android-how-do-i-do-a-lazy-load-of-images-in-listview –