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

时间:2011-04-24 09:31:45

标签: android memory memory-leaks android-tabhost

查看层次结构如下TabActivity - > ActivityGroups - > Activities

使用 MAT 我发现TabWidget引用了TabHostInputMethodManager引用了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}}

没有运气!


3 个答案:

答案 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,它是代码中的静态引用)