【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();
}
}
【Android开发坑系列】之经常被忽略的背景图片内存泄露的更多相关文章
- 【Android开发坑系列】之事件分发机制
总结一下: 事件序列的定义:从手触摸屏幕(含)到离开屏幕(含)期间所发生的一系列交互事件.主要由ACTION_DOWN.ACTION_MOVE.ACTOIN_UP.ACTION_CANCEL等组成,其 ...
- 【Android开发坑系列】之PopupWindow
PopupWindow在4.0之前的版本有个系统级别的BUG,必须借助一段自定义的fix代码来修复.其中mPopPm就是PopupWindow实例.java.lang.NullPointerExcep ...
- 【Android开发坑系列】如何让Service尽可能存活
流行的思路如下[2015-11-20更新]: 1.让Service杀不死.Service的onStartCommand返回START_STICKY,同时onDestroy里面调用startServic ...
- 【Android开发坑系列】之try-catch
try { mViewPager.postDelayed(new Runnable() { @Override public void run() { getCurrentPage().render( ...
- 【Android开发坑系列】之Fragment
这个东西有顾名思义是碎片,和之前的Activity对应. 坑1:一般情况都会想当然的以为进程被杀掉之后,Fragment也会被回收 其实,Fragment有自己的生命周期,有自己的管理器(Fragme ...
- 【Android开发坑系列】之事件
总结一下: 1.Touch事件分发中只有两个主角:ViewGroup和View.ViewGroup包含onInterceptTouchEvent.dispatchTouchEvent.onTouchE ...
- 【Android开发坑系列】之窗口管理
关键知识要点如下(持续更新): WindowManagerService只负责管理Window,不负责图像的绘制: SurfaceFlinger负责图像的合成:
- Android 开发 框架系列 OkHttp拦截器
前言 此篇博客只讲解okhttp的拦截器功能的详细使用,如果你还不太了解okhttp可以参考我另外一篇博客 Android 开发 框架系列 OkHttp使用详解 添加Interceptor的简单例子 ...
- Android根据Button状态(normal,focused,pressed)显示不同背景图片
Android根据Button状态(normal,focused,pressed)显示不同背景图片 Android中Button 有focused, selected, pressed 等不同状态,通 ...
随机推荐
- 分布式日志2 用redis的队列写日志
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- 【动态规划】bzoj1669 [Usaco2006 Oct]Hungry Cows饥饿的奶牛
#include<cstdio> #include<algorithm> using namespace std; int n,a[5001],b[5001],en; int ...
- java经典50编程题
菲波拉契数列:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? package com.day2; public ...
- Mysql --分区表(1)
检查是否支持分区 通过如下命令检查的Mysql是否支持partition mysql> SHOW PLUGINS; ... | ARCHIVE | ACTIVE | STORAGE ENGINE ...
- 斯坦福第七课:正则化(Regularization)
7.1 过拟合的问题 7.2 代价函数 7.3 正则化线性回归 7.4 正则化的逻辑回归模型 7.1 过拟合的问题 如果我们有非常多的特征,我们通过学习得到的假设可能能够非常好地适应训练集( ...
- JAVA的JNI调用
由于JNI调用C和调用C++差不多,而且C++中可以混合写C代码,所以这里主要是写关于JNI调用C++的部分. 一般步骤: 先是写普通的Java类,其中包括本地方法调用. 然后编译这个Java类,调 ...
- css3写的实用表单美化
<!DOCTYPE html> <!--[if IE 7 ]> <html lang="en" class="ie7"> & ...
- java中Class.getResource用法
用JAVA获取文件,听似简单,但对于很多像我这样的新人来说,还是掌握颇浅,用起来感觉颇深,大常最经常用的,就是用JAVA的File类,如要取得c:/test.txt文件,就会这样用File file ...
- Windows2003 SQL2005解决系统Administrator密码不知道的问题
Windows2003 SQL2005解决系统Administrator密码不知道的问题 今天上班的时候,有个同事说不知道谁设置了开机密码,那台电脑一直没有开机密码的他现在进不了桌面 那台电脑没有光驱 ...
- Dynamic CRM 2013学习笔记(三十四)自定义审批流5 - 自动邮件通知
审批过程中,经常要求自动发邮件:审批中要通知下一个审批人进行审批:审批完通知申请人已审批完:被拒绝后,要通知已批准的人和申请人.下面详细介绍如何实现一个自动发邮件的插件: 1. 根据审批状态来确定 ...