在没有添加动画时,回收完全正常,打印的信息也显示Bitmap已被回收。
    然而在加入动画之后:在设置好需显示的view中,还是在动画结束的监听器中释放bitmap都会报RuntimeException: Canvas: trying to use a recycled bitmap。
    大家帮帮忙,看看。package flipper.animation;import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ViewFlipper;public class FlipperAnimationActivity extends Activity
{
private ViewFlipper mFlipper;
private Button mButton;
private boolean mIsButtonDown = false;
private Bitmap mBitmap1 = null;
private Bitmap mBitmap2 = null;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mFlipper = (ViewFlipper) findViewById(R.id.flipper);
        mButton = (Button) findViewById(R.id.button);
        mButton.setOnClickListener(new ButtonListener());
        
        mFlipper.addView(addText("1", 0), 0);
        mFlipper.setDisplayedChild(0);
    }
    
    private View addText(String text, int index)
    {
     ImageView view = new ImageView(this);
     textAttribute(view, index);
     return view;
    }
    
    private void textAttribute(ImageView textView, int index)
    {
     if (index == 0)
     {
     textView.setBackgroundColor(Color.parseColor("#FF00FF00"));
     mBitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.clock);
     textView.setImageBitmap(mBitmap1);
     }
     else if (index == 1)
     {
     textView.setBackgroundColor(Color.parseColor("#FF0000FF"));
     mBitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
     textView.setImageBitmap(mBitmap2);
     }
    }
    
    class ButtonListener implements OnClickListener
    {
     private RotateAnimation rotate = new RotateAnimation(0f, 360f);
     private ScaleAnimation scale = new  ScaleAnimation(0f, 1f, 0f, 1f, 0.5f, 0.5f);
public void onClick(View v)
{
if (!mIsButtonDown)
{
rotate.setDuration(3000);
scale.setDuration(1000);
// mFlipper.setInAnimation(rotate);
// mFlipper.setOutAnimation(scale);
mFlipper.addView(addText("2", 1), 0);
Log.e("----", "flipper size: " + mFlipper.getChildCount());
mFlipper.setDisplayedChild(0);
mFlipper.removeViewAt(1);
Log.e("----", "flipper size: " + mFlipper.getChildCount());
mIsButtonDown = true;
scale.setAnimationListener(new AnimationListener() {

public void onAnimationStart(Animation animation)
{
}

public void onAnimationRepeat(Animation animation)
{
}

public void onAnimationEnd(Animation animation)
{
Log.e("---", "recycle: " + mBitmap1.isRecycled());
// 在此动画完成时释放,报RuntimeException: Canvas: trying to use a recycled bitmap
// 没有添加动画情况下,正常
mBitmap2.recycle();
Log.e("---", "recycle: " + mBitmap1.isRecycled());
}
});
Log.e("---", "recycle: " + mBitmap1.isRecycled());
// 添加动画后就报RuntimeException: Canvas: trying to use a recycled bitmap
// 没有添加动画情况下,正常
mBitmap1.recycle();
Log.e("---", "recycle: " + mBitmap1.isRecycled());
}
else
{
mFlipper.addView(addText("1", 0), 0);
Log.e("----", "flipper size: " + mFlipper.getChildCount());
rotate.setDuration(3000);
scale.setDuration(1000);
// mFlipper.setInAnimation(rotate);
// mFlipper.setOutAnimation(scale);
mFlipper.setDisplayedChild(0);
mFlipper.removeViewAt(1);
Log.e("----", "flipper size: " + mFlipper.getChildCount());
mIsButtonDown = false;
Log.v("---", "recycle: " + mBitmap2.isRecycled());
// 添加动画后就报RuntimeException: Canvas: trying to use a recycled bitmap
// 没有添加动画情况下,正常
mBitmap2.recycle();
Log.v("---", "recycle: " + mBitmap2.isRecycled());
}
}
    }
}