0

それぞれがアニメーションをアクティブにする2つのボタンを持つレイアウトがあります。ボタンをクリックすると、ボタンが消えるレイアウトが表示され、アニメーションが開始されます。メモリの問題により、最初のアニメーションの後に 2 番目のアニメーションをアクティブにできません。アニメーションの 1 つが再生された後、2 番目のアニメーションをロードできるように、何らかの形でメモリを解放する必要があります。アニメーションを解放してすべてのフレームを削除するにはどうすればよいですか?

これが私のコードです:

public class BermadMain extends Activity {
public static final String TAG = "Bermad";

AnimationDrawable animation, animation2, animation3;
ImageView imageAnim;
RelativeLayout lay;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

   lay = (RelativeLayout) findViewById(R.id.rallay);


  imageAnim =  (ImageView) findViewById(R.id.imageView1);

    final Button refinery = (Button) findViewById(R.id.refinery);
    refinery.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            int i=85;
            animation = new AnimationDrawable();
            animation.addFrame(getResources().getDrawable(R.drawable.ref1), i);
            animation.addFrame(getResources().getDrawable(R.drawable.ref2), i);
            animation.addFrame(getResources().getDrawable(R.drawable.ref3), i);
            animation.addFrame(getResources().getDrawable(R.drawable.ref4), i);
            animation.addFrame(getResources().getDrawable(R.drawable.ref5), i);
            animation.addFrame(getResources().getDrawable(R.drawable.ref6), i);
            animation.addFrame(getResources().getDrawable(R.drawable.ref7), i);
            animation.addFrame(getResources().getDrawable(R.drawable.ref8), i);
            animation.addFrame(getResources().getDrawable(R.drawable.ref9), i);
            animation.addFrame(getResources().getDrawable(R.drawable.ref10), i);
            animation.addFrame(getResources().getDrawable(R.drawable.ref11), i); 
            animation.addFrame(getResources().getDrawable(R.drawable.ref12), i); 
            animation.addFrame(getResources().getDrawable(R.drawable.ref13), i);

            imageAnim.setBackgroundDrawable(animation);
            imageAnim.post(new Refiney());
            lay.setVisibility(View.GONE);


        }
    });

    final Button oil = (Button) findViewById(R.id.oil);
    oil.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            int i=85;
            animation2 = new AnimationDrawable();
            animation2.addFrame(getResources().getDrawable(R.drawable.oil1), i);
            animation2.addFrame(getResources().getDrawable(R.drawable.oil2), i);
            animation2.addFrame(getResources().getDrawable(R.drawable.oil3), i);
            animation2.addFrame(getResources().getDrawable(R.drawable.oil4), i);
            animation2.addFrame(getResources().getDrawable(R.drawable.oil5), i);
            animation2.addFrame(getResources().getDrawable(R.drawable.oil6), i);
            animation2.addFrame(getResources().getDrawable(R.drawable.oil7), i);
            animation2.addFrame(getResources().getDrawable(R.drawable.oil8), i);
            animation2.addFrame(getResources().getDrawable(R.drawable.oil9), i);
            animation2.addFrame(getResources().getDrawable(R.drawable.oil10), i);
            animation2.addFrame(getResources().getDrawable(R.drawable.oil11), i); 
            animation2.addFrame(getResources().getDrawable(R.drawable.oil12), i); 
            animation2.addFrame(getResources().getDrawable(R.drawable.oil13), i); 

            imageAnim.setBackgroundDrawable(animation2);
            imageAnim.post(new Oil());
            lay.setVisibility(View.GONE);

        }
    });


}

public void onBackPressed() {

    lay.setVisibility(View.VISIBLE);
    return;
}   

class Refiney implements Runnable {

    public void run() {
        animation.start();        
    }
}

class Oil implements Runnable {

    public void run() {
        animation2.start();        
    }
}


} 
4

3 に答える 3

1

アニメーションにロードされたドローアブルを解放してみてください。Romain Guy の投稿で言及されている unbindDrawables() メソッドを確認してください。 http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/ (コードは同じ git にありませんが、別の場所でググることができます)。次に、 System.gc() を実行してメモリを再利用できます。

R.drawable.xxxx が Android にプリロードされているかどうかはわかりません。そうである場合は、画像をドローアブルではなくリソースに配置し、ビットマップを動的にロードする必要があります。

アニメーション自体がメモリーインテンシティブアクションです。アプリで 3M バイトを超える配列割り当てを引き起こすアニメーションがあります。アニメーションが終了するとすぐにメモリが再利用されますが、ピーク時のメモリ使用量が増加し、場合によっては OutOfMemory につながります。

于 2012-06-06T08:34:49.867 に答える
0

マニフェストの application タグに largeHeap=true を追加して、メモリの問題だけかどうかを確認してください。

于 2012-04-19T07:43:44.770 に答える
0

AnimationDrawable の問題は、すべての画像を animationdrawable Object にロードすることで、12MB を超える画像があると重くなってしまいます。配置largeHeap=trueすると、HeapSize が調整され、12MB 以上をロードするのに役立つ Heap が増加しますが、ロードするビットマップが増えると OutOfmemory になります。そのシナリオは

Handlerおよびを使用しrunnableて、イメージ シーケンスを 1 つずつ表示します。これにより、画像フレームが 1 つずつ読み込まれ、多くのメモリが消費されません。

画像ファイル名に増分番号シーケンスを付けて、以下のコードを使用して表示します。

int i=0;
Runnable mRunnable = new Runnable() {
            public void run() {
                displayBitmap(i);
                i++;
                imageView.postDelayed(r, 0);
            }
        };

    private void displayBitmap(int id) {
        String filePath ="FullpathofFileName"+.jpg";
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 2;
        Bitmap b = BitmapFactory.decodeFile(filePath, options);

        if (b != null) {
            imageView.setImageBitmap(b);
        }

    }
于 2013-04-22T11:34:56.480 に答える