0

我有一个带有 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() 来回收内存。

我不确定 Android 中是否预装了 R.drawable.xxxx。如果是,那么你不应该把图片放在drawable中,而是放在resource中,并动态加载位图。

动画本身就是记忆密集的动作。我的应用中有一个动画导致 >3M 字节数组分配。虽然动画一结束就回收了内存,但它增加了我的内存使用峰值,有时会导致 OutOfMemory。

于 2012-06-06T08:34:49.867 回答
0

尝试在清单的应用程序标记中添加 largeHeap=true 以了解这是否只是内存问题。

于 2012-04-19T07:43:44.770 回答
0

AnimationDrawable 的问题是它会将所有图像加载到 AnimationDrawable 对象中,当超过 12MB 的图像时,它变得很重。如果你放largeHeap=true它会调整 HeapSize 并增加堆,这有助于加载超过 12MB,但是当你有更多的位图要加载时它会 OutOfmemory。对于那种情况是

使用Handlerrunnable用于一一显示图像序列。这将一帧一帧地加载,不会占用太多内存。

将您的图像文件名与增量编号序列一起使用,并使用下面的代码进行显示。

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 回答