查看层次结构如下TabActivity
- > ActivityGroups
- > Activities
。
使用 MAT 我发现TabWidget
引用了TabHost
,InputMethodManager
引用了TabWidget
,因此InputMethodManager
被泄露。在后续启动应用程序时抛出OutOfMemory错误。
同样,InputMethodManager
也引用了我的所有活动。
(关闭应用程序后,我的所有活动组,活动,tabactivity,tabhost和tabwidget都被泄露!!)
在正确完成应用程序(按回键)后,logcat
中显示以下内容WARN / InputManagerService(99):在非聚焦客户端上启动输入com.android.internal.view.IInputMethodClient$Stub$Proxy@44a87748(uid = 10052 pid = 1463)
如何从onDestroy
移除引用??
我试过了:
一个。将TabActivity
的此方法称为myTabWidget.removeAllViews()
1. myTabWidger.invalidate()
2. {{1}}
没有运气!
答案 0 :(得分:3)
我也遇到了这个问题,我尝试了一些方法来避免它。当我的活动完成后,我尝试切断与输入法管理器服务的连接。看看:
class MyActivity extend Activity {
@Override
public void finish() {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.windowDismissed(mContentView.getWindowToken());
super.finish();
}
}
我不确定这是否可以解决这个内存泄漏问题。现在,它工作正常。你可以尝试一下。
答案 1 :(得分:1)
我尝试过:A。调用此方法onDestroy我的TabActivity 1.myTabWidget.removeAllViews()2.myTabWidger.invalidate()
当然,它不会起作用。 MVC / MVP / MVVM和Android SDK类层次结构中的活动都不是视图。 android.app.Activity不扩展android.view.View
我的同事有类似的内存泄漏问题 - 他以静态方式在TabActivity中声明了tabHost(当他不熟悉模式观察者时,他想从另一个活动中访问它)。我认为你已经做了类似的事情。
最后,我的问题是:为什么你在InputMethodManager中引用活动(虽然我不明白它是什么:它是最终的类)而不是活动中的InputMethodManager?如果你想要InputMethodManager的全局焦点,我建议你把它的引用放到Application类。我们扩展了Application类(例如,HostApplication),在这个Facade中我们声明了常见的东西(例如,SharedPreferences)。在我们写的活动中:
HostApplication application = (HostApplication) getApplication();
然后我们从中获得有用的常见内容。
答案 2 :(得分:1)
你确定内存泄漏是真的吗?我有类似的情况,虽然它看起来像MAT中的内存泄漏,但由于InputMethodManager,我无法获得两个TabActivity实例。当然,InputMethodManager似乎保持TabActivity不被垃圾收集。但是,如果这是一个真正的内存泄漏,我不能看到两个TabActivites,然后是三个,然后是四个?
(仅供参考,我能够在一个点上看到两个TabActivities,但问题不在于InputMethodManager,它是代码中的静态引用)