您的位置:首页 > 其它

解决内存泄漏案例

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. 禁止硬件加速效果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: