InputMethodManager保存对tabhost的引用 - Memory Leak - OOM Error

Man*_*ani 13 memory android memory-leaks android-tabhost

视图层次结构如下TabActivity- > ActivityGroups- > Activities.

使用MAT我发现TabWidget被引用的TabHost引用InputMethodManager,因此TabWidget被泄露.在后续启动应用程序时抛出OutOfMemory错误.

同样,我的所有活动也被引用InputMethodManager.(关闭应用程序后,我的所有活动组,活动,tabactivity,tabhost和tabwidget都被泄露!!)

在正确完成应用程序(按回键)后,将在logcat中显示以下内容

WARN/InputManagerService(99):在非聚焦客户端上启动输入com.android.internal.view.IInputMethodClient$Stub$Proxy@44a87748(uid = 10052 pid = 1463)

如何从InputMethodManager...中删除引用?

我尝试过:

A.称onDestroy我的这种方法TabActivity
1. myTabWidget.removeAllViews()
2.myTabWidger.invalidate()

没运气!


Qui*_*ick 1

我尝试过的事情:A.在我的 TabActivity 的 Destroy 上调用此方法 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),在这个外观中我们声明通用的东西(例如 SharedPreferences)。在活动中我们写道:

HostApplication application = (HostApplication) getApplication();
Run Code Online (Sandbox Code Playgroud)

然后我们从中得到有用的常见东西。