一、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。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • mysql中phpmyadmin安装教程_特详细的PHPMYADMIN简明安装教程

    mysql中phpmyadmin安装教程_特详细的PHPMYADMIN简明安装教程特详细的PHPMYADMIN简明安装教程更新时间:2008年08月01日00:27:12作者:简单的说,phpmyadmin就是一种mysql的管理工具,安装该工具后,即可以通过web形式直接管理mysql数据,而不需要通过执行系统命令来管理,非常适合对数据库操作命令不熟悉的数据库管理者,下面我就说下怎么安装该工具:1.先到网上下载phpmyadmin,再解压到可以访问的web目录下(如果…

  • js定时器setinterval_nodejs定时器

    js定时器setinterval_nodejs定时器最近帮公司的APP前端做RN,要求是用typescript,然后就掉进坑里了,别的不说,先说说setInterval()这个定时器函数,因为typescript是强类型语言,定义setInterval()必须定义其返回值,但是你无论用百度或者谷歌搜中文也好英文也罢,都告诉你setInterval()的返回值类型是number,但是真的是这样么?让我们看看如果你将setInterval()定…

  • cortex m3堆栈_arm m0 内核

    cortex m3堆栈_arm m0 内核CortexM3Bit-banding简介分类: ARM MCU2012-06-1914:30 1369人阅读 评论(0) 收藏 举报存储byte语言iocbit-band是Cortex-M3内核中针对某一段区域进行位和字映射的机制,对于位操作,如IO控制LED,相比传递的C语言的位操作,提供了很大的方便.bit-band区域将存储器别名区(bit-ba

    2022年10月13日
  • java键值对_Java 读写键值对

    Properties类(读入写出键值对)是Map子类Map方法都能用publicstaticvoidmain(String[]args)throwsIOException{//读出Propertiespro=newProperties();FileInputStreamfis=newFileInputStream(“F:\\Demo.properties”);//Fi…

  • (2021 最新版)IntelliJ IDEA 下载安装及配置教程

    (2021 最新版)IntelliJ IDEA 下载安装及配置教程前言因为自己电脑最近实在是太卡了,也一直提示更新,索性就直接重装了个系统。因为需要重装下IDEA,而现在新版本的IDEA和之前的版本还是有很大变化的,所以在这里写一篇博客做个记录,方便自己后续配置,也顺便分享给大家。准备工作既然要安装IDEA,那么首先需要前往JetBrains的官网下载最新版的IDEA,下载地址如下:https://www.jetbrains.com/idea/download/这里最新的版本是2021.1.2,而因为我有旗舰版的账号,所以这里就以旗舰版安装

  • 笔记内容

    笔记内容

发表回复

您的电子邮箱地址不会被公开。

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