在没有添加动画时,回收完全正常,打印的信息也显示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());
}
}
}
}
然而在加入动画之后:在设置好需显示的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());
}
}
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货