【Android开发坑系列】之经常被忽略的背景图片内存泄露
我们平时设置图片的时候,几乎都忘记回收老的(背景)图片,比如:
- 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(); } }
本博客所有随笔,若未明确标示为转载或未带有原文链接,皆为原创。
本博客所有随笔版权归博客园和kai.ma所有,欢迎转载,转载请保留:
本博客所有随笔版权归博客园和kai.ma所有,欢迎转载,转载请保留:
- 出处:http://kaima.cnblogs.com
- 作者:kai.ma