解决内存泄漏案例
2016-04-13 20:47
651 查看
要点分析
1. 通过代码分析,我们发现在计时器界面中,采用了AnimationDrawable方式来实现动画,如下代码:
drawable = getApplicationContext().getResources()
.getDrawable(R.drawable.countdown_sandglass_anim);
mDustFallStart.setBackgroundDrawable(drawable);
mAnimationDust = (AnimationDrawable)
mDustFallStart.getBackground();
mAnimationDust.setOneShot(false);
该方式耗用内存较大,同时在界面退出时没有对动画句柄没有有效释放,这样,每次再次进入该界面点击运行动画效果时,内存不断累积。
2. 同时通过MAT工具发现,界面onDestroy函数中,没有对内部类的引用释放的操作,导致循环引用,内存没有释放。
3.计时器apk为5M左右大小,其中动画效果使用了60多张图片,每张图片为100K左右大小。
4. 通过UiInspector工具分析发现,代码中存在冗余资源文件和冗余代码。
5. 通过抓取应用的内存映射区发现,计时器apk运行时,硬件加速开启导致耗用内存很大。
解决措施
1. 将计时器动画效果修改为ImageView定时设置背景图的方式,如下代码所示:
public
void run() {
mDustBg.setBackgroundResource(drawableRes[num++]);
if (num >= drawableRes.length) {
num = 0;
}
loopHandler.postDelayed(this, 100);
}
2. 通过MAT工具解决各界面的内存泄露问题,包括从循环链上的其他对象下手.
在销毁时候将view、bitMap等关联引用置空,比如btn.setOnClickListener(null).
3. 将apk中60多张图片修改为17张图片,每张图片为22k左右。
4. 通过UiInspector工具将代码中冗余资源文件删除,并把代码中冗余代码删除。
5. 禁止硬件加速效果。
1. 通过代码分析,我们发现在计时器界面中,采用了AnimationDrawable方式来实现动画,如下代码:
drawable = getApplicationContext().getResources()
.getDrawable(R.drawable.countdown_sandglass_anim);
mDustFallStart.setBackgroundDrawable(drawable);
mAnimationDust = (AnimationDrawable)
mDustFallStart.getBackground();
mAnimationDust.setOneShot(false);
该方式耗用内存较大,同时在界面退出时没有对动画句柄没有有效释放,这样,每次再次进入该界面点击运行动画效果时,内存不断累积。
2. 同时通过MAT工具发现,界面onDestroy函数中,没有对内部类的引用释放的操作,导致循环引用,内存没有释放。
3.计时器apk为5M左右大小,其中动画效果使用了60多张图片,每张图片为100K左右大小。
4. 通过UiInspector工具分析发现,代码中存在冗余资源文件和冗余代码。
5. 通过抓取应用的内存映射区发现,计时器apk运行时,硬件加速开启导致耗用内存很大。
解决措施
1. 将计时器动画效果修改为ImageView定时设置背景图的方式,如下代码所示:
public
void run() {
mDustBg.setBackgroundResource(drawableRes[num++]);
if (num >= drawableRes.length) {
num = 0;
}
loopHandler.postDelayed(this, 100);
}
2. 通过MAT工具解决各界面的内存泄露问题,包括从循环链上的其他对象下手.
在销毁时候将view、bitMap等关联引用置空,比如btn.setOnClickListener(null).
3. 将apk中60多张图片修改为17张图片,每张图片为22k左右。
4. 通过UiInspector工具将代码中冗余资源文件删除,并把代码中冗余代码删除。
5. 禁止硬件加速效果。
相关文章推荐
- 【WC2013】糖果公园
- JavaWeb——基于过滤器的用户权限控制
- 引用
- tabindex的用法
- 我的求职经历
- eclipse 上使用recycleview,cardview的办法
- 安卓使用URL访问网络
- ubuntu 14.04 java开发环境搭建 jdk 以及 inteliJ IDEA安装
- 2016年阿里实习一面经历
- 计算机组成与体系结构重点(四川大学软件学院)
- 拆迁通知
- 我的求职经历
- cobbler 一键自动化安装系统
- Kruskal算法求最小生成树(POJ2485)
- 学习理论-在线学习
- 【C++】输入输出运算符的重载
- 18 滑雪 dp-4
- 出差(2~六)
- Windows下Python,setuptools,pip,virtualenv的安装
- 在action中使用Servlet的API松耦版