回收Bitmap时报RuntimeException: Canvas: trying to use a recycled bitmap

demo_ 2012-10-30 04:29:11
在没有添加动画时,回收完全正常,打印的信息也显示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());
}
}
}
}
...全文
699 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
南瓜饼 2012-10-31
  • 打赏
  • 举报
回复
你把textView也删除掉bitmap回收的时候 然后在需要的时候代码加载上 这样写有问题的 如果bitmap回收了 但是textview还在用 一定会报错的呀
AlecVon 2012-10-30
  • 打赏
  • 举报
回复
监听动画结束了,在onAnimationEnd中clean一下,然后再回收图片
demo_ 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
提示你的是:图片被回收了,你却还想在使用
[/Quote]
这个我明白,问题就是没有加动画的时候没问题,加动画确出现这个错误呀。
franzhong 2012-10-30
  • 打赏
  • 举报
回复
提示你的是:图片被回收了,你却还想在使用

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧