一、Bitmap的recycle问题

一、Bitmap的recycle问题

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

    尽管Android有自己的垃圾回收机制,对于是不是要我们自己调用recycle,还的看情况而定。假设仅仅是使用少量的几张图片,回收与否关系不大。但是若有大量bitmap须要垃圾回收处理,那必定垃圾回收须要做的次数就很多其它也发生地更频繁,会对系统资源造成负荷。所以,这个时候还是自己试用recycle来释放的比較好。

    怎样去使用recycle()方法和何时试用recycle()都是值得考虑的问题。否側,极易出现以下的异常:

05-15 08:31:00.117: E/AndroidRuntime(513): java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@44c093b8

java执行时异常:试图使用一个已经回收了的图片

  仅仅有当你确认你不会在使用这个bitmap的时候,就能够选择调用recycle()方法释放它。

  今天在做个小測试的时候,就由于recycle()的调用出现了异常。原因是:

在xml文件里,ImageView有两个方法来设置一张显示的图片:

 android:background="@drawable/aa"
 android:src="@drawable/aa"

刚開始,我使用background,然后在程序中,这样设置

                        // 获得ImageView当前显示的图片
			Bitmap bitmap1 = ((BitmapDrawable) imageView.getBackground()).getBitmap();
			
			Bitmap bitmap2 = Bitmap.createBitmap(bitmap1, 0, 0, bitmap1.getWidth(),
					bitmap1.getHeight(), matrix, true);
			// 假设图片还没有回收,强制回收
			if (!bitmap1.isRecycled()) {
				bitmap1.recycle();
			}
			// 依据原始位图和Matrix创建新的图片
			imageView.setImageBitmap(bitmap2);

由于imageView.setImageBitmap()方法设置的是相应的src的图片,而不是background。而我却把background的图片给回收了。这样,就导致了异常的发生。

所以改动成例如以下的代码,去调用setBackGround()方法

                       // 获得ImageView当前显示的图片
			Bitmap bitmap1 = ((BitmapDrawable) imageView.getBackground()).getBitmap();
			Bitmap bitmap2 = Bitmap.createBitmap(bitmap1, 0, 0, bitmap1.getWidth(),
					bitmap1.getHeight(), matrix, true);
			// 假设图片还没有回收,强制回收
			if (!bitmap1.isRecycled()) {
				bitmap1.recycle();
			}
			// 依据原始位图和Matrix创建新的图片
			//imageView.setImageBitmap(bitmap2);
			imageView.setBackgroundDrawable(new BitmapDrawable(bitmap2));

所以,一定要注意ImageView图片的来源问题,然后在进行对应的recycle。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118089.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • rj45网络接口线序_rj11接口定义4芯线序

    rj45网络接口线序_rj11接口定义4芯线序RJ45接口定义常见的RJ45接口有两类:用于以太网网卡、路由器以太网接口等的DTE类型,还有用于交换机等的DCE类型。DTE我们可以称做“数据终端设备”,DCE我们可以称做“数据通信设备”。从某种意义来说,DTE设备称为“主动通信设备”,DCE设备称为“被动通信设备”。当两个类型一样的设备使用RJ45接口连接通信时,必须使用交叉线连接。这个可以从如下的RJ45DTE类型引脚定义和RJ4

    2022年9月17日
    5
  • tensorflow实现DCGAN

    tensorflow实现DCGAN1 DCGAN 的简单总结 Paper nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp http arxiv org abs 1511 06434 github nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp https github com Newmu dcgan code nbsp nbsp theano nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp https github com carpedm20 DCGAN tensorflow nbsp nbsp tensorflow nbsp nbsp

    2025年10月22日
    2
  • C#中使用 Oracle的事务与存储过程「建议收藏」

    C#中使用 Oracle的事务与存储过程

    2022年3月12日
    40
  • webstorm 2021 激活码【中文破解版】

    (webstorm 2021 激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~MLZPB5EL5Q-eyJsaWNlb…

    2022年3月21日
    35
  • input 事件[通俗易懂]

    input 事件[通俗易懂]input事件1.onfocus当input获取到焦点时触发2.onblur当input失去焦点时触发,注意:这个事件触发的前提是已经获取了焦点再失去焦点的时候会触发相应的js3.onchange当input失去焦点并且它的value值发生变化时触发4.onkeydown在input中有键按住的时候执行一些代码5.onkeyup在input中有键抬起的时候触发的事件,…

    2022年4月30日
    73
  • 安卓 toast_安卓toast使用

    安卓 toast_安卓toast使用概述一个toast是在屏幕上弹出一条信息,它的大小总是包裹着需要显示的内容,并且当前的Activity依然是可见并且可互动的。toast会自动消失,并且不接受任何互动事件。因为toast可以在后台的 Service 中创建,所以即使这个应用程序没有显示在屏幕上,仍然可以弹出toast.toast最好用来显示简要的信息,比如断定用户正在注意屏幕时,弹出”Fil

    2025年11月3日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号