Trying to use recycled bitmap的来龙去脉

本文记录了在Android开发中遇到的Bitmap被回收后尝试使用的错误,包括详细的错误信息及可能的原因分析。

你妹的,先起个标题


java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@406b4870, 301x400


11-28 22:18:35.788 E/AndroidRuntime(12550): java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@405b6320, 310x310


11-29 11:13:42.449: E/AndroidRuntime(4725): java.lang.IllegalArgumentException: Cannot draw recycled bitmaps

在 Android 开发中,尝试使用已回收的 `android.graphics.Bitmap` 可能会导致 `java.lang.RuntimeException` 异常。以下是一些解决该问题的办法: ### 避免提前回收正在使用的 Bitmap 若 `bitmap` 被用于视图显示,一定不能对其进行回收,否则即便当时未报错,关闭屏幕再回来或者调用 `buildCache` 方法时仍会报错。若觉得 `bitmap` 过大,应提前进行压缩处理,而不是回收它 [^2]。 ### 处理 LruCache 缓存问题 在 Android 应用开发中,常使用 `LruCache<String, Bitmap>` 对图片进行缓存,不过 `LruCache` 在清除 `bitmap` 时,并未将 `bitmap` 回收。手动回收可能会报 `trying to use a recycled bitmap` 错误。因此,在使用 `LruCache` 时,要谨慎处理 `bitmap` 的回收操作,避免手动回收正在使用的 `bitmap` [^4]。 ### 避免并发操作导致的回收问题 在开发安卓应用涂鸦模块时,若对图片进行涂鸦后保存,快速点击保存按钮,可能会使第一次点击触发“保存按钮”的点击事件,第二次点击触发“涂鸦”事件。但此时图片已完成保存操作,系统开始回收 `Bitmap` 缓存资源,涂鸦事件相当于在已回收的 `Bitmap` 上添加涂鸦,从而导致报错。针对这种情况,可通过控制按钮点击事件的响应逻辑,避免并发操作导致的 `Bitmap` 回收问题 [^5]。 ```java // 示例代码:控制按钮点击事件,避免并发操作 Button saveButton = findViewById(R.id.save_button); saveButton.setOnClickListener(new View.OnClickListener() { private boolean isSaving = false; @Override public void onClick(View v) { if (!isSaving) { isSaving = true; // 执行保存操作 saveDoodle(); // 保存完成后恢复标志 isSaving = false; } } }); private void saveDoodle() { // 保存涂鸦的具体逻辑 } ``` ### 检查 Bitmap 状态 在使用 `Bitmap` 之前,可先检查其是否已被回收,若已回收则重新加载或创建新的 `Bitmap`。 ```java if (bitmap != null &&!bitmap.isRecycled()) { // 使用 bitmap } else { // 重新加载或创建新的 bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.your_image); } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值