2012-03-06 39 views
4

私は2つのボタンがありstart.iになります最初のアニメーションを起動描画可能animations.whenアプリケーションは、No.of用意しています(次と前の)同じactivity.whenと、私は次のボタンをクリックして、私は、のような例外だアンドロイドでOutOfMemoryErrorを解決するにはどうすればいいですか?

java.lang.OutOfMemoryError: bitmap size exceeds VM budget 

私のコードは、描画可能から描画可能なアニメーションを取得するための

private void getAnimationForLetters(int mAnim) { 
     // TODO Auto-generated method stub 
     String anim = "capital_anim_" + new Integer(mAnim).toString(); 

     final int resID = getApplicationContext().getResources().getIdentifier(
       anim, "drawable", "my-package-name"); 
     mImgLetter.clearAnimation(); 
     mImgLetter.setBackgroundResource(resID); 
     mImgLetter.post(new Runnable() { 

      public void run() { 
       loadingAnimation = (AnimationDrawable) mImgLetter 
         .getBackground(); 
       loadingAnimation.start(); 
      } 
     }); 

    } 

私の次のボタンのコードは、ある

case R.id.btnNext_: 
unbindDrawables(findViewById(R.id.imgLetter)); 
mLetterNum=mLetterNum+1; 
getAnimationForLetters(mLetterNum); 

私undind描画可能なメソッドのコードは、

private void unbindDrawables(View view) { 
     if (view.getBackground() != null) { 
      view.getBackground().setCallback(null); 
     } 
     if (view instanceof ViewGroup) { 
      for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { 
       unbindDrawables(((ViewGroup) view).getChildAt(i)); 
      } 
      ((ViewGroup) view).removeAllViews(); 
     } 
    } 

は最終的に私はそれがここにmImgLetter.setBackgroundResource(resID); 例外を示している例外java.lang.OutOfMemoryError: bitmap size exceeds VM budget を得た私を助けてください。

私は、以前のボタンをクリックした場合、私は私が得たそれは秒のアニメーション、二度目の隣のアニメーションの動きにのみ、次またはprevious.First時間のクリックのために正常に動作している、

loadingAnimation.stop(); 
     for (int i = 0; i < loadingAnimation.getNumberOfFrames(); ++i){ 
      Drawable frame = loadingAnimation.getFrame(i); 
      if (frame instanceof BitmapDrawable) { 
       ((BitmapDrawable)frame).getBitmap().recycle(); 
      } 
      frame.setCallback(null); 
     } 
     loadingAnimation.setCallback(null); 

をクリアするために、次のコードを追加しました例外のように、

Canvas: trying to use a recycled bitmap android.graphics.Bitmap 

私を助けてください。

答えて

2

解像度とメモリが少ない携帯端末で高解像度画像を使用すると、この問題が発生することがあります。 Drawable-hdpi、Drawable-mdpi、Drawable-ldpiフォルダを使用し、適切な解像度で画像を配置します。

多くの場合、heapSizeが小さすぎるとほとんどの場合エミュレータでこのエラーが表示されることがあります。 AVDマネージャを使用してヒープサイズを増やすようにしてくださいすることは

このリンクは、あなたに役立つかもしれない あなたが空きメモリにこれを使用することができSupporting multiple screen resolutions

+0

私のイメージのサイズは290x330.Iでは、それはGarbageCollectorを呼び出すことはありません。この問題ではない –

-2

system.gc(); 
+1

を考えます! GarbageCollectorが今すぐチェックを実行できるのであれば、 "それは素晴らしいだろう"と言います。 – Sly

0

以下のメモリのうちは議論されているリンクを見詳細に。トーマスのソリューションは、過去に働いている私にとって

Android Out of memory issue

希望します。

+0

こんにちはDeva、コードを追加しました。 –

+0

xmlであらかじめ定義されたフレームで構成されるアニメーションのケースでは役に立ちません – Ewoks

3

正確には、システムはゴミをいつ収集するかを知っているので、それを呼び出すことは一切役に立たない。

あなたは本当にあなたのアプリのメモリを管理する必要があります。 290x330はあまり見えないかもしれませんが、1ピクセルあたり4バイトのフルRGBAを使用している場合、画像は380Kに変わります。あなたがこれらのいくつかを持っているなら、あなたは記憶を使い果たすでしょう。ほとんどのAndroidデバイスはPCのようなものではなく、メモリが限られています。 OSやユーザーが同時に実行している他のアプリケーションを含め、すべてを実行するのは16Mまたは24Mのみです。

あなたはのtry/catchとリソースをロードするために、あなたのルーチンをラップ試してみてください

While(! success) { 
    try { 
     // load resources 
    } catch (OutOfMemoryError E) { 
     // do something to use less memory and try again 
    } 
} 
+0

コードを追加しました。一度確認してください。 –

関連する問題