要点分析
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. 禁止硬件加速效果。