0

私はアンドロイドゲームを開発しています。xml ファイルを使用して 2 つのメニューを作成します。背景が同じ場合、メニューは正常に動作しますが、背景が異なる場合、プログラムは OutOfMemoryError でクラッシュします。

2 つの xml ファイルは次のようになります。

ファイル 1:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="wrap_content"
        android:gravity="center_horizontal"
        android:layout_height="wrap_content"
        android:background="@drawable/background">

                Bunch of TextViews

ファイル 2 は、背景が @drawable/background2 であることを除いてまったく同じです。

私が得る LogCat エラーは次のとおりです。

E/AndroidRuntime(534): FATAL EXCEPTION: GLThread
E/AndroidRuntime(534): java.lang.OutOfMemoryError
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:605)

このエラーが背景画像の変更にどのように関連しているかはよくわかりません。問題は、使用している背景画像のサイズとは関係ありません。800KB の背景画像を 1 つ試してみたところ問題はありませんでしたが、150KB 前後の異なる背景画像を 2 つ試してみるとエラーが発生します。

メニューを作成するアクティビティがあります。

 public class MenuActivity extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main_new); 

どんな助けでも大歓迎です。ありがとう

4

2 に答える 2

0

ガベージコレクタをクリアできます。それ

@Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        Runtime.getRuntime().gc();
        System.gc();
        super.onDestroy();
    }
于 2012-05-19T03:08:52.277 に答える
0

この問題は、使用している背景画像のサイズとは関係ありません。

大きさの意味は違いますが、実はそうなんです。BitmapAndroid はすべての画像をsARGB_8888形式で内部的にロードするため、ファイル サイズは実行時には問題になりません。つまり、すべてのピクセルが 4 バイトで表され、ビジュアル サイズ(画像のサイズ/解像度) によって画像の表示に必要なメモリが決まります。たとえば、800 x 480 ピクセルの画像には、実行時に 800 * 480 * 4 = 1536000 バイト、または約 1.5 MB が必要です。

そうは言っても、Android が指定するさまざまな密度のバケットにアセットを提供することが重要である理由は明らかです。「Supporting Multiple Screens」ガイドをまだ読んでいない場合は、読むことを強くお勧めします。適切なサイズのアセットを提供すると、メモリ使用量が大幅に改善される可能性がありますが、通常は apk が大きくなるという犠牲が伴います。

さらに、さらにいくつかのオプションがあります。たとえば、背景画像の内容が許す場合は、それらを9-patchesに変換します。画像を (品質上の理由で非推奨)ARGB_4444形式で読み込んで実験することもできます。これにより、 ARGB_8888.

recycle()最後に、実装の仕様によっては、リソースを手動で解放することで (たとえば、オブジェクトを呼び出すことで)、実行時のメモリ使用量を改善できる場合がありBitmapます。Dalvik VM は参照されていないリソースのガベージ コレクションも処理しますが、それが実際に行われるまでに数サイクルかかる場合があります。Bitmapリソースを明示的に解放すると役立つ場合があり、たとえば、 のみをロードしてそれらをテクスチャとして OpenGL パイプラインに渡す場合は一般的な方法です。gl.glDeleteTextures(...)また、OpenGL テクスチャを使用する場合は、不要になったテクスチャを含むメモリを解放するために呼び出すことを忘れないでください。

于 2012-05-19T03:15:27.593 に答える