【Android开发坑系列】之经常被忽略的背景图片内存泄露
来源:互联网 发布:java把字符串转为整形 编辑:程序博客网 时间:2024/05/29 02:44
我们平时设置图片的时候,几乎都忘记回收老的(背景)图片,比如:
- TextView.setBackgroundDrawable()
- TextView.setBackgroundResource()
- ImageView.setImageDrawable()
- ImageView.setImageResource()
- ImageView.setImageBitmap()
这样造成内存浪费,积少成多,整个软件可能浪费不少内存。
如果记得优化,整个软件的内存占用会有10%~20%的下降。
// 获得ImageView当前显示的图片Bitmap bitmap1 = ((BitmapDrawable) imageView.getBackground()).getBitmap();Bitmap bitmap2 = Bitmap.createBitmap(bitmap1, 0, 0, bitmap1.getWidth(),bitmap1.getHeight(), matrix, true);// 设置新的背景图片imageView.setBackgroundDrawable(new BitmapDrawable(bitmap2));// bitmap1确认即将不再使用,强制回收,这也是我们经常忽略的地方if (!bitmap1.isRecycled()) { bitmap1.recycle();}
看上面的代码,设置新的背景之后,老的背景确定不再使用,则应该回收。
封装如下(仅针对setBackgroundXXX做了封装,其他的原理类同):
/** * 给view设置新背景,并回收旧的背景图片<br> * <font color=red>注意:需要确定以前的背景不被使用</font> * * @param v */@SuppressWarnings("deprecation")public static void setAndRecycleBackground(View v, int resID) { // 获得ImageView当前显示的图片 Bitmap bitmap1 = null; if (v.getBackground() != null) { try { //若是可转成bitmap的背景,手动回收 bitmap1 = ((BitmapDrawable) v.getBackground()).getBitmap(); } catch (ClassCastException e) { //若无法转成bitmap,则解除引用,确保能被系统GC回收 v.getBackground().setCallback(null); } } // 根据原始位图和Matrix创建新的图片 v.setBackgroundResource(resID); // bitmap1确认即将不再使用,强制回收,这也是我们经常忽略的地方 if (bitmap1 != null && !bitmap1.isRecycled()) { bitmap1.recycle(); }}/** * 给view设置新背景,并回收旧的背景图片<br> * <font color=red>注意:需要确定以前的背景不被使用</font> * * @param v */@SuppressWarnings("deprecation")public static void setAndRecycleBackground(View v, BitmapDrawable imageDrawable) { // 获得ImageView当前显示的图片 Bitmap bitmap1 = null; if (v.getBackground() != null) { try { //若是可转成bitmap的背景,手动回收 bitmap1 = ((BitmapDrawable) v.getBackground()).getBitmap(); } catch (ClassCastException e) { //若无法转成bitmap,则解除引用,确保能被系统GC回收 v.getBackground().setCallback(null); } } // 根据原始位图和Matrix创建新的图片 v.setBackgroundDrawable(imageDrawable); // bitmap1确认即将不再使用,强制回收,这也是我们经常忽略的地方 if (bitmap1 != null && !bitmap1.isRecycled()) { bitmap1.recycle(); }}
http://www.cnblogs.com/kaima/p/3497525.html
0 0
- 【Android开发坑系列】之经常被忽略的背景图片内存泄露
- Android开发内存泄露之--Handler引起的内存泄露
- Android应用开发之避免内存泄露
- Android开发之—内存泄露篇
- 经常被忽略的知识点
- Android内存泄露分析之-内存泄露的原因
- Android开发--Handler引起的内存泄露
- Android开发 Handler引起的内存泄露
- Android开发:详解Handler的内存泄露
- android开发中内存泄露的原因
- Android学习系列--App调试内存泄露之Context篇
- Android之AsyncTask的内存泄露问题
- 【Android 开发】Android App 内存泄露之Handler
- Android 内存管理系列之一:内存泄露
- android的内存泄露
- android的内存泄露
- 一些经常被忽略的Java知识
- Android开发--内存泄露调试
- oracle数据库性能查询
- .jar/war/ear包的区别
- linux中halt,shutdown等区别
- IOS开发之实现App消息推送(最新)
- 一个完整项目的实现
- 【Android开发坑系列】之经常被忽略的背景图片内存泄露
- 自定义ImageView实现播放帧动画
- 列正交化-施密特正交化方法
- ios 得到每周的星期一开始和星期天结束的日期
- Android如何不用setCustomView而实现ActionBar的自定义修改
- 二叉搜索树、二叉平衡树、B-树
- PopupWindow中使用GridView
- Pexpect 模块的学习
- 第九周项目一猴子选大王