解决内存泄漏案例

要点分析

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


你可能感兴趣的:(解决内存泄漏案例)