【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
原创粉丝点击