5

だから私はこれを得る:

'01-01 20:37:34.859: E/dalvikvm-heap(19921): Out of memory on a 6471856-byte allocation.'

一連の変数をメモリに割り当てようとするとき。次のような 24 個の変数を割り当てています。

mElements.add(new ShopElement(getResources(),R.drawable.shop_starter, b1X , b1Y,true,1,"red",true,5,checkLocked(0)));

そして、これらのうちの1つ:

bNumbers = new Bitmap[] {Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h0)
        , 65,65, true),
        Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h1)
        , 65,65, true),
        Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h2)
        , 65,65, true),
        Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h3)
        , 65,65, true),
        Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h4)
        ,65,65,true),
        Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h5)
        , 65,65, true),
        Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h6)
        , 65,65, true),
        Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h7)
        , 65,65, true),
        Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h8)
        , 65,65, true),
        Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h9)
        , 65,65, true),
        Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.time)
                , 50,50, true)};

しかし、私が作成した 24 の要素のうち #16 を通過する前に、特定の電話でクラッシュします。

私はGalaxy S2を持っており、正常に動作しますが、S3やその他の電話ではクラッシュします。

リクエストに応じて、より多くの情報を提供させていただきます。

以前にこのエラーを検索し、解決策を適用しようとし、「ビットマップを効率的に表示する」ことを調べましたが、何も役に立たないようです。

私の頭を回転させるのは、S2 では動作するが、S3 では動作しないということです。S3 はあらゆる点で S2 を超えるべきではありませんか?

グローバルな BitmapFactory.Options を使用してすべてのビットマップを描画しています。次のようにオプションを設定しています。

Global.opts = new BitmapFactory.Options();
    Global.opts.inDither=false;                     
    Global.opts.inPurgeable=true;                  
    Global.opts.inInputShareable=true;              
    Global.opts.inTempStorage=new byte[16 * 1024]; 
4

3 に答える 3

8

単に、より多くのメモリにアクセスしようとしているだけです。したがって、解決策は、メモリを増やすか、使用可能なメモリのみを使用することです

そのための3つの提案。

1) を使用BitmapFactory.Optionsしていてもエラーが続く場合は、特定のイメージに対して適切な構成を使用していないことを意味します。ヒープサイズが十分であることを確認してください

 BitmapFactory.Options opts=new BitmapFactory.Options();
        opts.inDither=false;                     //Disable Dithering mode
        opts.inSampleSize = 8;                    // scale image upto 1/8 of the original image.
        opts.inPurgeable=true;                   //Tell to gc that whether it needs free memory, the Bitmap can be cleared
        opts.inInputShareable=true;              //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
        opts.inTempStorage=new byte[16 * 1024]; //you can increase this value as per your need.

属性を使用して、サイズを大きくしてinTempStorage機能させたりsample、画像を拡大したりできinSampleSizeます。サンプリングの詳細については、このリンクを参照してください。

さまざまなオプションで遊んでみてください。それはうまくいくはずです。

2) ファイルでandroid:largeHeap="true"属性を使用してアプリの全体的なヒープ サイズを増やすこともできmanifestますが、これはハニカム以前のデバイスでは機能しません。2.3 より前のデバイスでは、VMRuntime クラスを使用できます。

3)ヒープサイズをプログラムで検出し、必要に応じて変更したい場合は、このリンクをたどることができます。

于 2013-01-02T04:57:45.783 に答える
2

このエラーは、より多くのメモリを使用しようとしていることを明確に示しています。これは、画像サイズを直接指しています。そのため、使用するメモリを少なくするには、画像のサイズを変更する必要があります。この理由で使用できるのはBitmapFactory.Optionです。または、手動で画像のサイズを変更して、すべてのニーズに合うように注意してください. 説明の都合上、

ヒープ サイズは、実行するアプリケーションに割り当てられるメモリの量です。Android アプリケーションのヒープ サイズは、デバイスの RAM によって決まります。たとえば、デバイスに 179 MB の RAM がある場合、Android アプリケーションは 18 MB のヒープ サイズのみを取得します。

詳しくはこちらをご覧ください。大きなビットマップを効率的にロードする方法の詳細については、こちらを参照してください。

私は Galaxy S2 を持っており、正常に動作しますが、S3 やその他の電話ではクラッシュします

あなたが言及したデバイスのRAMサイズをチェックアウトしてください。

于 2013-01-02T04:32:24.457 に答える
1

Android メモリ管理では、すべてのアプリに使用できる最大ヒープ メモリがあり、アプリがヒープ メモリを超える量を使用すると、Android OS は自動的にアプリを強制終了します。したがって、 「メモリ不足の例外」が発生するのはあなただけです..

これを解決するには、Android の NDK コンセプトを使用できます。ヒープ コンセプトは SDK 部分用であるため、..

つまり、

NDK を使用して 300MB を超える RAM (利用可能な場合) を使用するアプリを作成できますが、SDK では不可能です

于 2013-01-02T04:30:11.687 に答える