完美解决 trying to use a recycled bitmap android.graphics.Bitmap@41d的异常

Glide导致的RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap 文章目录Glide使用背景使用方式一:into传入ImageView分析1:scaleType=fitXY是否会导致trying to use a recycled bitmap异常?分析2:into传入imageView是否会导致trying to use a recycled bitmap异常?使用方式二:into传入ViewTarget异常原因分析解决方案 Glide导致的RuntimeException: Canvas: trying to use a recycled bitmap android 阅读详情
AI摘要

本文详细探讨了在Android开发过程中因频繁使用AnimationDrawable播放动画而导致的内存溢出问题及解决方案。通过深入分析Bitmap回收机制,提供了有效避免tryingtousearecycledbitmap异常的方法。


在最近一个项目中,因为要使用AnimationDrawable进行动画播放,图片质量都比较大,而且播放的频率会很多,开发的行车记录仪的内存又有限,刚开始并没有将Bitmap recycle掉,所以出现了OOM的异常。为了解决内存溢出问题,在退出当前页面的时候,将Bitmap recycle掉。但是在此又遇到了另外一个问题,退出当前界面再进入这个页面的时候会报出   trying to use a recycled bitmap android.graphics.Bitmap@41d的异常。

此后看了很多文章,但是都并不能真正的解决这个问题,只能从源码查起了。

分析问题出现原因是在我们加载drawable的时候可能bitmap recycle后,被再次使用,所以导致此问题的出现。跟踪一下源代码 getResource(context).getDrawable(id)==继续进入代码==>loadDrawable(value, id);在这个里面我们可以看到关键代码

 Drawable dr = getCachedDrawable(isColorDrawable ? mColorDrawableCache : mDrawableCache, key);

        if (dr != null) {
            return dr;
        }


在此可以看出,如果缓存Drawable不为空,那么就返回原先使用的Drawable,在我们这里,这个Drawable引用的Bitmap已经被recycle了,但是Drawable这个缓存对象是一直并引用那个失效的Bitmap。其实系统这样设计我们可以理解,为了不用再次加载这个Bitmap为了节省系统资源,但在我们此处因为要使用到大量图片来播放动画(也有别的需求只是加载大图片,防止内存溢出,所以退出页面时recycle这个图片),所以系统的这种方法对我们来说是会适得其反的。

找到问题的要点,那么我们着手开始解决这个问题

1、在退出页面执行onDestory()回调的时候,回收图片资源以及把AnimationDrawable的对象置空,并调用GC让系统尽快回收

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

		
		//资源回收否则会造成内存溢出
		tryRecycleAnimationDrawable(animation);
		AnimationDrawble置空
		animation = null;
		把针对AnimationDrawble的引用置空
		tv.setBackground(null);
		系统垃圾回收
		System.gc();
	}
	//把AnimationDrawable中的图片资源逐个回收
	private void tryRecycleAnimationDrawable(
			AnimationDrawable animationDrawables) {
		if (animationDrawables != null) {
			animationDrawables.stop();
			for (int i = 0; i < animationDrawables.getNumberOfFrames(); i++) {
				Drawable frame = animationDrawables.getFrame(i);
				if (frame instanceof BitmapDrawable) {
					Bitmap bitmap = ((BitmapDrawable) frame).getBitmap();
					bitmap.recycle();
					bitmap = null;
				}
				frame.setCallback(null);
			}

			animationDrawables.setCallback(null);

		}
	}


2、重点在再次进入程序后如果不再调用cacheDrawable很遗憾的是我们默认的加载系统资源的方法getResource(context).getDrawable(id)默认会调用该方法来加载资源,我们只能另辟捷径了。使用系统最原始方法加载图片资源 BitmapFactory.decodeResource(Resources, resId);

不过此方法如果图片资源大会很容易在这里造成OOM,对这块儿的处理暂时省略,相信读到这篇文章的童鞋自会知道怎么处理。在这里得到最新的Bitmap后,new AnimationDrawable并把bitmap加载进去就OK


由于每个人使用场景不同,业务也不一样,如果上面仍然不能解决你们的问题,所以有几个博客做为参考:

http://blog.youkuaiyun.com/u010829905/article/details/50233207   Android bitmap.recycle()导致trying to use a recycled bitmap报错分析

http://blog.youkuaiyun.com/yaya_soft/article/details/44064249  Android手动回收bitmap,引发Canvas: trying to use a recycled bitmap处理


http://blog.youkuaiyun.com/sex_34/article/details/47725707   Canvas: trying to use a recycled bitmap android.graphics.Bitmap@XXX



单片机:实现FFT快速傅里叶变换算法(附完整源码) 阅读详情

相关推荐

达梦数据库连接报错6001网络通信异常

本文主要记录客户端连接达梦数据库报错6001网络通信异常问题分析过程、问题原因以及问题解决方法。

chen_zizi2025的博客 2772

trying to use a recycled bitmap android.graphics.Bitmap

异常:trying to use a recycled bitmap android.graphics.Bitmap 概意:试图使用已经recycled的Bitmap 一般情况下我们在对Bitmap进行Matrix的各种缩放、平移等处理,然后createBitmap,再对之前的Bitmap进行recycle处理。 例如: Bitmap oldBitmap= BitmapFactory.d...

MyLoveGame的专栏 4510

电源芯片TPS54560典型应用电路及设计详解

TPS54560 是一款配有集成型高侧 MOSFET 的 60V、5A DC-DC转换器,输入电压范围7-60V,输出电压可通过外部反馈电阻设置成略低于输入电压的任意值。**所以,**R5=31.25KΩ、R6:10KΩ(常用值)时,即可设置输出电压为 3.3V。**所以,**R5=140KΩ、R6:10KΩ(常用值)时,即可设置输出电压为12V。设计 TPS54560 的输出电压时,主要通过外部反馈电阻网络来设置输出电压。因此,输出 3.3V ,输入电压24V时推荐的电感值为 8µH 至 10µH。

weixin_42306872的博客 1万+

Android小提示五

文章目录【68.让ProgressDialog在setCancelable(false)时按返回键可dismiss】【69.传递数据 Intent,LiveDataBus,EventBus】【70.资源警告No package identifier】【72.Handler警告】【73.List集合 containsAll 方法】【74.判断是否为 null】【75.设置字体】【76.布局优化】【77.判断当前APP后台运行】【78.Android第一次安装后Home键重启问题】未验证【79.一些属性-横竖屏

kami_zeros的博客 919

常见js手撕题及算法总结

设计一个lazyMan,实现以下功能: LazyMan(‘Tony’); // Hi I am Tony LazyMan(‘Tony’).sleep(10).eat(‘lunch’); // Hi I am Tony // 等待了10秒… // I am eating lunch LazyMan(‘Tony’).eat(‘lunch’).sleep(10).eat(‘dinner’); // H...

没有名字适合我的博客 3176

2023 年全国网络安全行业职业技能大赛-电子数据取证分析师-决赛WP_2023网络安全行业赛取证

数据库取证工具里面可以恢复删除掉的数据带红叉的就说删除过的,game库下面announcement_detail表里面update_time字段使用sql语句时间戳最大为1513243355转换时间为2017-12-14 17:22:35。

2401_89791684的博客 2092

trying to use a recycled bitmap android.graphics.Bitmap@af903b

这个异常的原因大多是因为调用了 bitmap.recycle(); 这个方法,后面继续使用bitmap的时候就报错,就算是重新赋值也没用 网上很多分析了 是说如果后面使用的图片资源是一样的,会优先使用缓存里的bitmap对象。 调用了recycle方法后bitmap不可用,而你又去调用了,就报错了。 网上有说重写view的onDraw方法捕获异常,但是这样方法只是掩耳盗铃,没什么用。 ...

zpswz的博客 592

扩散模型在工业缺陷检测中的应用与优化

扩散模型作为生成式AI的重要分支,通过逐步去噪的逆向过程实现高质量数据生成。其核心U-Net架构结合残差连接和时间步嵌入,特别适合处理工业场景中的细微缺陷检测。在计算机视觉领域,这种技术突破了传统深度学习模型对小样本数据的限制,通过域自适应预训练和小样本微调两阶段框架,显著提升金属表面、纺织品等复杂场景的检测准确率。关键技术实现涉及噪声调度优化、多任务损失设计等工程实践,最终在MVTec AD等工业数据集上达到90%以上的检测精度,为智能制造提供可靠的自动化质检方案。

weixin_30512043的博客 497

Bitmap回收异常:trying to use a recycled bitmap android.graphics.Bitmap问题解决

在android应用开发过程中,经常使用LruCache 对图片进行缓存,LruCache在清除bitmap时,并没有将bitmap recycle。手动 recycle可能会报trying to use a recycled bitmap错误。   解决思路:在bitmap recycle时,判断bitmap是否在使用。         mMemoryCache = new LruCache

tv19830417的博客 1647

用 ADT 的 RAP Generator 把 RAP 栈一键搭起来:从表到可预览的 OData V4 应用

摘要 SAP RAP Generator 工具能显著提升开发效率,通过一键生成从数据库表到完整 OData UI Service 的全套对象(包括 CDS、Behavior、Service Definition 等)。该工具特别适用于原型验证和标准化应用开发,可节省 60% 以上的基础编码时间。使用时需注意: 表设计需包含关键管理字段(如 last_changed 时间戳) 向导配置决定分层架构和命名规范 生成结果包含可立即预览的 Fiori Elements 界面 后续可专注于业务逻辑增强(校验、权限等)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1281

【PCIe硬件】PCIe引脚PRSNT与热插拔

热插拔的基本目的是要让PCIe设备按照规定的顺序、原则,从系统中移除或插入到系统中来,并能正常的工作,且不影响系统的正常运行。事实上,PCIe“热插拔”的关键目的就是为前面面所提到的系统RAS服务的,是提升系统RAS能力的非常重要的手段!注意,这里有两个相关概念,前面我们讲的热插拔,其实是广义的“热插拔”。这里的Hot-Plug,为了方便,我们叫做PCIe热插拔,也就是我们现在及后面将要讨论的内容。

smartvxworks的博客 2807

trying to use a recycled bitmap android.graphics.Bitmap@41d的异常 分析和解决

  最近压力测试的时候遇到上面的这个问题,具体错误又不报哪一行错误;错误日志如下:Short Msg: java.lang.RuntimeException Long Msg: java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@4630f45 Build Label...

wolfking0608的博客 1974

AUTOSAR MCAL开发及EB Tresos工具使用总结

在基于AutoSar CP架构开发MCAL时,会使用到EB tresos工具。本文主要对MCAL开发及EB tresos工具使用进行总结,仅作为自学使用,以方便后续查漏补缺。

liuxu324的博客 2628

关于bitmap recycle trying to use a recycled bitmap android.graphics.Bitmap

在开发中,一直使用4.0以上手机作为测试机所以一直没有出现这个问题,今天换了2.3版本的手机,出现了这个错误: trying to use a recycled bitmap android.graphics.Bitmap 后检查代码,我的图片回收代码是介个样子的: public static void recycle(View view) { if (null == view

fkepgydhbyuan的专栏 3865

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Android bitmap.recycle()导致trying to use a recycled bitmap报错分析

在android实际项目中,有时会在Activity的onDestroy()做一些资源释放工作,比如bitmap资源。通常的写法是这样 public class NextActivity extends Activity { private ImageView imageView; @Override protected void onCreate(Bundle savedInstan

不良丶青年 4314

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Android Bitmap使用recycle()后 报:trying to use recycled bitmap 的问题

//ImageView 释放资源  public static void bitmapClear(ImageView image)  {  if (!(image.getDrawable() instanceof BitmapDrawable)) { return; }  BitmapDrawable bitmap = (BitmapDrawable) image.getDra

liufeifeinanfeng的博客 1617

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

trying to use a recycled bitmap解决之道

在做Android应用涉及到大量图片展示的时候,如果没有对内存做妥善处理,经常会报OOM的异常。其实也好理解,图片占用了太多内存。这个时候除了需要对图片进行压缩,另外还需要及时通过调用bitmap.recycle()释放图片占用的内存。但是盲目的调用这个方法,很有可能会出现trying to use a recycled bitmap的崩溃。尤其是你不确定回收的图片后续会不会被继续调用。  

z343986392的专栏 1836

Android手动回收bitmap,引发Canvas: trying to use a recycled bitmap处理

转自:http://zwnjava.iteye.com/blog/1901880  在做Android的开发的时候,在ListView 或是 GridView中需要加载大量的图片,为了避免加载过多的图片引起OutOfMemory错误,设置了一个图片缓存列表 Map> imageCache , 并对其进行维护,在图片加载到一定数量的时候,就手动回收掉之前加载图片的bitmap,此时

冷秋魂的专栏 2万+

【Bitmap】Canvas: trying to use a recycled bitmap android.graphics.Bitmap问题

Canvas: trying to use a recycled bitmap android.graphics.Bitmap问题 我这用到bitmap中间变量了,还用到 Bitmap bitmap = Bitmap.createBitmap(temp, 0, 0, width, height, matrix,true);方法了。 把temp.recycle();后就报了那个错误。  

天。朝程序猿的专栏 1万+

今天遇到Canvas: trying to use a recycled bitmap android.graphics.Bitmap问题

今天遇到Canvas: trying to use a recycled bitmap android.graphics.Bitmap问题 我这用到bitmap中间变量了,还用到 Bitmap bitmap = Bitmap.createBitmap(temp, 0, 0, width, height, matrix,true);方法了。 把temp.recycle();后就报了那个错误。

Aaronzzq的专栏 3723

oppo r9plus 无限制重启前的日志。

几个无意义网站访问dm.wo.com.cn/www.heytapmobi.comdata.ads.heytapmobi.com/ 09-10 14:49:06.325 13607-13607/? W/activity_lifecycle: com.heytap.cdo.client.ui.activity.MainTabPageActivity@3a5fe0 stop 09-10 14:49:06.335 13607-13607/? D/Tinker.DefaultAppLike: onTr...

5366

Canvas: trying to use a recycled bitmap android.graphics.Bitmap@XXX

最近在做和图片相关显示的出现了一个问题,整理一下思路,分享出来给大家参考一下: Exception Type:java.lang.RuntimeException java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@XXXXX at android.graph

sex_34的专栏 1万+

Glide trying to use a recycled bitmap android.graphics.Bitmap

现象 Canvas: trying to use a recycled bitmap android.graphics.Bitmap@67d0cbd ndroid.graphics.BaseCanvas.throwIfCannotDraw(BaseCanvas.java:55) 1 android.graphics.BaseCanvas.throwIfCannotDraw(BaseCanvas.j...

xDong66的博客 1637

关于异常Canvas: trying to use a recycled bitmap android.graphics.Bitmap的解决

这个异常Canvas: trying to use a recycled bitmap android.graphics.Bitmap之所以发生,大多是由于在XML布局文件中对ImageView进行BitmapDrawable的设置,这种设置方式会使得系统对Bitmap资源进行缓存,以供ImageView在下一次进行再利用。如果第一次使用时把它recycle()了,那么下一次再使用被回收的资源时也

qq_27912289的博客 2398

分析Canvas: trying to use a recycled bitmap android.graphics.Bitmap@84709c2

本人最近开发遇到一个特别难特别难得问题,纠结了两天,终于发现问题原因!但是发现原因后,我好忧伤~因为原因很简单。。。 先简单说一下我的情况,以供大家参考: 1.项目中有两个Activity,分别是ActivityA和ActivityB。 2.ActivityA作为启动页,并且android:launchMode="singleTask"。ActivityA中有个按钮,可以跳转到Act

女汉子的奋斗~ 3223

Bitmap详解(上)

采用webp能够在保持图片清晰度的情况下,可以有效减小图片所占有的磁盘空间大小。每个像素会采用 n 个二进制位来存储颜色信息。实现了Parcelable接口的常量类。Config是Bitmap类中的枚举。解压后无法还原出完整的原始图像数据。每一个方向上的像素数量来表示分辨率。解压后能还原出完整的原始图像数据。分辨率为 640x480 的图片。每个像素能显示 2^n 种颜色。以像素为最小单位构成的图。位图像素中行之间的字节数。位图图像细节的精细程度。水平像素数×垂直像素数。压缩后的体积仍然很大。

听海的博客 4959
上一篇: Android TextView中添加链接并在链接部分字体变色可点击
下一篇: HashMap实现原理分析
VIPqiangqiang
博客等级 码龄14年 7粉丝 83原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值