2014-01-21 33 views
0

虽然直接来到家活动,我传递的意图标志FLAG_ACTIVITY_CLEAR_TOP后,我仍然可以看到HPROF记录的其它活动的参考。内存泄漏,甚至使用FLAG_ACTIVITY_CLEAR_TOP

在HPROF报告中,我可以看到大多数的内存泄漏是由于以下几点: android.media.AudioManager。在EDITTEXT

或SpellCheckListener

请帮我解决这个内存泄漏。清除顶部应完成所有活动。

如果透明罩面完成的活动,然后从那里audiomanager或spellchecklistener正在进入画面。在我的代码中,我没有使用audiomanager或spellchecklistener。

+1

内存泄漏可以是任何东西,没有进一步的细节没有答案可以给。观看整个剪辑以获取有关如何查找泄漏的线索:http://www.youtube.com/watch?v=_CruQY55HOk – Friesgaard

+1

您是否在内存转储之前强制垃圾回收?除此之外,你会看到还没有收集到的东西,尽管它们一旦需要记忆。清除顶部也或多或少不相关。你的'活动'必须完成(他们通常是你离开他们后),你的代码不能持有参考。 – zapl

+0

@zapl如果它是在hprof中,那么它意味着仍然在那里。如果我错了,请纠正我。 –

回答

0
Intent intObj=new Intent(context, MainActivity.class); 
      intObj.putExtra("finish", true); // if you are checking for this in your other Activities 
      intObj.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | 
          Intent.FLAG_ACTIVITY_CLEAR_TASK | 
          Intent.FLAG_ACTIVITY_NEW_TASK); 
      startActivity(intObj); 
0

这个答案不会给你一个明确的解决办法,而不是因为我不愿意,而是因为这是不可能的(甚至没有困难不只是看你的代码,但他非常清楚你的代码)。但根据我的经验,我可以告诉你,那些内存泄漏不仅仅是由于直接引用的对象 - 你声明的对象(并且继续引用另一个类/对象)依赖于许多其他类等等,而且可能你会发现内存泄漏是由于你的任何实例的处理不正确,而这些实例同时引用其他实例,这就是为什么你看到一个你甚至没有声明的类的原因。

调试内存泄漏通常是一项非常艰苦的工作,不仅因为如上所述,它有时不直接依赖于您声明的内容,而且因为找到解决方案可能不是微不足道的。你可以做的最好的事情就是你已经做的事情:DDMS + HPROF。我不知道你有多少知识,但尽管这不是一种通用方法,但this link帮助我在代码中找到内存泄漏。

虽然看起来微不足道,但调试这些类型的最好方法是逐步删除部分代码(总体来说,暗示与其他类的实例一起工作)并查看HPROF报告如何更改。