trying to use a recycled bitmap分析

最近遇到了这个问题:
trying to use a recycled bitmap android.graphics.Bitmap@1d5a0d5c.

于是,写个程序复现这个情况;

public class MainActivity extends AppCompatActivity {

    ImageView imageView;
    Bitmap bitmap;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView = (ImageView) findViewById(R.id.iv);

        bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.aaa);

        imageView.setImageBitmap(bitmap);

        try{
            if(bitmap!=null&&!bitmap.isRecycled()){
                bitmap.recycle();
            }
        }catch (Exception e){

        }

    }

    public void onClickFinish(View view){
        finish();
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();

    }
}

情景分析:
程序顺序执行,使用图片工厂获取图片后让ImageView显示,即ImageView持有bitmap,此时又继续执行了判断显然bitmap不为空,所以
bitmap调用recycle()方法回收。这就导致一个问题,原来bitmap是归ImageView持有现在回收了,此时ImageView持有一个被回收的数据,所以会报这样的错误。

解决办法:
bitmap什么时间回收呢?这涉及一个回收时机问题
bitmap没有被引用时回收,也就是不再使用。
所以对于一个activity而言,在onDestory()方法中调用 finish方法执行时回收

代码:

@Override
    protected void onDestroy() {
        super.onDestroy();
        if(bitmap!=null&&!bitmap.isRecycled()){
            bitmap.recycle();
            bitmap = null;
        }
    }

下面列举我所遇到bitmap回收使用情况:

Bitmap 情况分析:
1.
oldbitmap作为参数传入方法中,然后使用传入bitmap重新生成新的bitmapA
此时
if(bitmapA!=null){
oldbitmap.recycle();
oldbitmap = bitmapA;
}

是正确的。
2.
如果根据res 生成bitmap
此时

Bitmap getBitmap(Bitmap mbitmap) {

    Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.cccc);

    if (bm != null) {
        mbitmap.recycle();
        mbitmap = bm;
    }

    return mbitmap;
}

是正确的
3.
传入参数bitmap基础上又形成新的bitmap

Bitmap getBitmap(Bitmap mbitmap) {

    Matrix matrix = new Matrix();
    matrix.postScale(1, 1); // 长和宽放大缩小的比例

    Bitmap resizeBmp = Bitmap.createBitmap(mbitmap, 0, 0, 200, 200, matrix,
            false);
    if (mbitmap != null) {
        mbitmap.recycle();
    }

    return resizeBmp;
}

此时 正确

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值