2012-01-23 13 views
2

私のゲームでは、メインメニュー - >サブメニュー - >ゲーム画面の3つのアクティビティがあります。したがって、ユーザーがゲーム画面でプレイしているときは、最初の2つのアクティビティはアクティブではなく破棄されません。Android - 背景画像が多すぎるメモリを取る

各レイアウトには素晴らしい背景画像があります。画像自体は非常に小さく(40k)、大画面(Galaxyタブレットなど)では数メガバイトのメモリが必要です。 最初の2つのアクティビティからバックグラウンドを削除した後、3番目のアクティビティでのメモリ使用量は18Mから13Mに減少します!

バックグラウンドを維持し、このすべての無駄なメモリを回復する方法はありますか?

+1

私は一時的な修正を考えています。あなたは、その3番目のページにいるときに最初の2つのものからバックグラウンドを取り除くonclickを持つことができます。 – VicVu

答えて

2

新しいアクティビティ(C)を開始するときに以前のアクティビティを終了しないでください。 次に、アクティビティCのonKeyDownメソッドをオーバーライドして、前のアクティビティ(B)を開始します。

+0

Cを起動すると、どのようにBを終了できますか?私はコード内でどこにC.finish()を置くべきですか? – dop2000

+0

申し訳ありません、B.finish() – dop2000

+0

新しい活動の意図を開始する前に、man.justを呼んでください。 –

0

アクティビティのonPause()またはonStop()をオーバーライドすることをお勧めします。そこには、背景を解放することができます(layout.setBackgroundDrawable(null)を呼び出すことによって)

+0

これはメモリを減少させません。おそらくGCが怠惰です。 – dop2000

+0

System.gc()への明示的な呼び出しはいつでも追加できます。また、あなた自身のアクティビティ自体が背景イメージに参照を持たないようにしてください。 –

3

私の問題はあなたと同じだと思う、この解決策はあなたを助けるでしょう。

Why does the normal pictures allocated a lot of memory?

あなたは/ resを/描画可能nodpiを使用することができ、背景のPictrueは、専用メモリサイズの半分を取ります。

4

レイアウトの背景イメージのため、同様の問題が発生しました。イメージのメモリ割り当ての通常のサイズは、height * width * 4バイト(デフォルトモードのARGB_8888モード)でなければなりません。

アクティビティを表示しているときに18MBが表示されている場合は、何か問題があるはずです。ドローイング可能なフォルダに背景画像を置いているかどうか確認してください。その場合、システムはその画像を画面の特定の濃度に拡大しなければならず、大きなメモリオーバヘッドが発生します。

ソリューション:

  1. 各描画可能なフォルダに配置した背景画像の特定のバージョンを(MDPI、hdpi、xhdpi ...)ので、システムは、任意のスケーリング処理をperfomする必要はありません。
  2. "drawable-nodpi"という特別なリソースフォルダに背景イメージを配置します。システムは、このディレクトリに置かれた画像を拡大縮小しようとはしません。そのため、ストレッチ処理が実行され、割り当てられたメモリが予想されます。

このanswer

での詳しい情報は、この情報がお役に立てば幸いです。

+0

こんにちは、これは私が数日間検索した解決策です。私は画像をキャッシュし、デコードしますが、これ以外は動作しません。どうもありがとう。 xxhdpiフォルダに高解像度の画像を追加するだけです – smoothumut