【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的世界,道法自然博客园博客,原文链接:http://www.cnblogs.com/kaima/p/3497525.html,如需转载请自行联系原作者。

目录
相关文章
|
4天前
|
XML 存储 Java
探索安卓开发之旅:从基础到进阶
【9月更文挑战第37天】安卓开发,一个充满无限可能的领域。它不仅关乎技术的深度与广度,更关乎开发者的成长与突破。本文将带你走进安卓开发的世界,从基础知识的学习到进阶技巧的掌握,一起感受编程的魅力与乐趣。
|
1天前
|
Android开发
Android开发表情emoji功能开发
本文介绍了一种在Android应用中实现emoji表情功能的方法,通过将图片与表情字符对应,实现在`TextView`中的正常显示。示例代码展示了如何使用自定义适配器加载emoji表情,并在编辑框中输入或删除表情。项目包含完整的源码结构,可作为开发参考。视频演示和源码详情见文章内链接。
11 4
Android开发表情emoji功能开发
|
1天前
|
JSON API Android开发
探索安卓开发之旅:打造你的第一个天气应用
在这篇文章中,我们将一起踏上一段激动人心的旅程,学习如何在安卓平台上开发一个简单的天气应用。通过实际操作和代码示例,我们将逐步构建一个能够显示当前位置天气情况的应用。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供清晰的指导和启发性的见解,帮助你理解和掌握安卓开发的基础知识。让我们一起探索代码的世界,解锁新技能,实现你的创意和梦想。
|
1天前
|
存储 XML 开发工具
探索安卓开发之旅:从新手到专家
在这篇文章中,我们将一起踏上一段激动人心的旅程,深入探索安卓开发的奥秘。无论你是刚刚起步的初学者,还是希望提升技能的中级开发者,亦或是渴望成为领域专家的资深人士,这里都有你需要的知识与技巧。通过浅显易懂的语言和逐步深入的内容安排,本文将带你了解安卓开发的核心概念、常用工具和最佳实践,助你构建稳固的知识基础,开启技术进阶之路。让我们开始吧!
|
3天前
|
设计模式 前端开发 数据库
探索安卓开发之旅——从初学者到专家
在数字时代的浪潮中,安卓应用开发成为了众多开发者的热门选择。本篇文章旨在为初入安卓开发的新手提供一个清晰的学习路径,从基础概念到高级技巧,逐步引导读者掌握安卓开发的核心知识。我们将通过实际代码示例,展示如何从零开始构建一个安卓应用,并介绍一些提升开发效率的工具和库。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你打开一扇通往安卓开发世界的大门。
|
存储 编解码 Android开发
Android内存优化-Bitmap内存优化
在日常开发中,我们不免会使用到Bitmap,而bitmap确实实在在的是内存使用的 “大户”,如何更好的使用 bitmap,减少其对 App内存的使用,是我们开发中不可回避的问题。
180 0
Android内存优化-Bitmap内存优化
|
存储 编解码 缓存
|
14天前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。