我按照这里的“避免内存泄漏”文章进行操作。
然而,该解决方案并不能解决泄漏问题。我在Windows XP (SDK 2.3.1)上使用Android模拟器进行了测试。我导出了堆信息并检查主活动仍然存在于堆中(我使用MAT)。
下面是我所做的:
- 创建HelloWorld应用程序,其中包含HelloWorldActivity(它没有子视图)
- 运行模拟器并启动HelloWorld应用程序。
- 通过点击返回键关闭应用程序。
- 在DDMS中执行垃圾回收并导出堆 <-- 在这里我发现了HelloWorldActivity实例。
- 从它的'Path to GC Roots'中显示以下路径。
HelloWorldActivity <- PhoneWindow$DecorView <- InputMethodManager
InputMethodManager是一个单例,有三个对DecorView的引用,而DecorView又引用了HelloWorldActivity。
我无法理解为什么即使活动已被销毁,InputMethodManager仍然引用DecorView实例。
是否有任何方法可以确保主活动在关闭后被销毁且可进行垃圾回收?