博客
关于我
Android Bitmap操作问题之Canvas: trying to use a recycled bitmap
阅读量:439 次
发布时间:2019-03-06

本文共 814 字,大约阅读时间需要 2 分钟。

一、Bitmap.recycle 方法被弃用

在Android中,Bitmap的存储分为两部分,一部分是Bitmap的数据,一部分是Bitmap的引用。在Android2.3时代,Bitmap的引用是放在堆中的,而Bitmap的数据部分是放在栈中的,需要用户调用recycle方法手动进行内存回收,而在Android2.3之后,整个Bitmap,包括数据和引用,都放在了堆中,这样,整个Bitmap的回收就全部交给GC了,这个recycle方法就再也不需要使用了。

下图是在Android系统源码里面截取的关于 recycle方法的说明:

可以发现,系统建议你不要手动去调用,而是让GC来进行处理不再使用的Bitmap。我们可以认为,即使在Android2.3之后的版本中去调用recycle,系统也是会强制回收内存的,只是系统不建议这样做而已。但是,当我们真这么天真的认为的时候,发现报错了,错误信息如下:

java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@1a50ff6b

 

二、问题的分析与解决

从日志可以很明显的看出,Bitmap被调用recycle方法回收后,又调用了Bitmap的一些方法而导致的。可是,代码中可以发现我们recycle的是bitmap而不是通过Bitmap.createBitmap重新生成的targetBmp,为什么会报这个exception呢?

 里面有一句很重要的注释:

The new bitmap may be the same object as source, or a copy may have been made.

看来还是真有可能为同一个对象的!

解决方法:如果你的代码不需要兼容2.3版本的情况下,就别使用recycle了,还是交给GC处理吧。

 

转载地址:http://gidfz.baihongyu.com/

你可能感兴趣的文章
027 实例6-圆周率的计算
查看>>
小白专场-树的同构-python语言实现
查看>>
191006
查看>>
08-03 细分构建机器学习应用程序的流程-流程简介
查看>>
B-概率论-条件概率
查看>>
191107
查看>>
191120
查看>>
191123
查看>>
第4章 字符串、数组和特殊矩阵
查看>>
0608-nn和autograd的区别
查看>>
MYSQL 数据库结构优化
查看>>
leetcode 一些算法题及答案
查看>>
spring 整合 ActiveMQ
查看>>
PHP 取前一天或后一天、一个月时间
查看>>
Kafka 分布式的,基于发布/订阅的消息系统
查看>>
Spring Bean的加载
查看>>
Web笔记(一) Web 简介与开发环境搭建
查看>>
Java基础回顾-缓冲流
查看>>
JSONPath小试牛刀之Snack3
查看>>
更强的 JsonPath 兼容性及性能测试
查看>>