博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Bitmap的recycle问题
阅读量:5298 次
发布时间:2019-06-14

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

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

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

[java] 
  1. 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有两个方法来设置一张显示的图片:

[java] 
  1. android:background="@drawable/aa"  
  2. android:src="@drawable/aa"  
刚开始,我使用background,然后在程序中,这样设置

[java] 
  1.                      // 获得ImageView当前显示的图片  
  2. Bitmap bitmap1 = ((BitmapDrawable) imageView.getBackground()).getBitmap();  
  3.   
  4. Bitmap bitmap2 = Bitmap.createBitmap(bitmap1, 00, bitmap1.getWidth(),  
  5.         bitmap1.getHeight(), matrix, true);  
  6. // 如果图片还没有回收,强制回收  
  7. if (!bitmap1.isRecycled()) {  
  8.     bitmap1.recycle();  
  9. }  
  10. // 根据原始位图和Matrix创建新的图片  
  11. imageView.setImageBitmap(bitmap2);  
因为imageView.setImageBitmap()方法设置的是对应的src的图片,而不是background。而我却把background的图片给回收了。这样,就导致了异常的发生。

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

[java] 
  1.                     // 获得ImageView当前显示的图片  
  2. Bitmap bitmap1 = ((BitmapDrawable) imageView.getBackground()).getBitmap();  
  3. Bitmap bitmap2 = Bitmap.createBitmap(bitmap1, 00, bitmap1.getWidth(),  
  4.         bitmap1.getHeight(), matrix, true);  
  5. // 如果图片还没有回收,强制回收  
  6. if (!bitmap1.isRecycled()) {  
  7.     bitmap1.recycle();  
  8. }  
  9. // 根据原始位图和Matrix创建新的图片  
  10. //imageView.setImageBitmap(bitmap2);  
  11. imageView.setBackgroundDrawable(new BitmapDrawable(bitmap2));  
所以,一定要注意ImageView图片的来源问题,然后在进行相应的recycle。

转载于:https://www.cnblogs.com/zsw-1993/p/4879960.html

你可能感兴趣的文章
Vue中登录模块
查看>>
正则表达式1--特殊字符
查看>>
python基础(四)
查看>>
2018 ACM南京网络赛H题Set解题报告
查看>>
深入理解JS立即执行函数
查看>>
python基础知识学习:列表和元组
查看>>
Django logging配置
查看>>
iOS开发日记6-跳转appStore评分
查看>>
SpringBoot war包部署到Tomcat服务器
查看>>
对缓存的思考——提高命中率
查看>>
让静态页面显示用户登录状态
查看>>
K-means算法
查看>>
input提示文字;placeholder字体修改
查看>>
MyBatis知识点总结(一)
查看>>
面试题链接记录
查看>>
Android Studio 版本间区别
查看>>
SQL SERVER: 合并相关操作(Union,Except,Intersect)
查看>>
1025-完数
查看>>
汇编第二章知识总结
查看>>
负载均衡简单配置
查看>>