Android严格模式检测到多个活动实例违规,但我不知道为什么

时间:2013-03-12 17:36:07

标签: android memory-leaks android-strictmode

代码可能过于复杂而无法在此完整发布,但这里是基本模式:我有两个Activity子类,每个子类都有一个ListView。每个ListView都有一个自定义类的适配器,它还生成自定义类的View个实例。这些列表显示了在另一个线程中异步生成的数据项;因为它需要知道将更新发送到何处,所以它操作的数据对象具有WeakReference<>个对象,这些对象被设置为在初始化时保持对显示其内容的适配器的引用。当选择第一个活动列表中的对象时,我启动第二个活动,其意图指示它查找项目并显示其内容。然后我使用“后退”按钮关闭第二个活动并返回第一个活动。出于某种原因,当我在启用StrictMode检查的情况下运行它时,它会在两次活动之间切换几次后总是崩溃,抱怨我的Activity类之一的实例太多了。

我已安排在崩溃之前写入堆转储(请参阅Android StrictMode and heap dumps)。这些堆转储始终显示在终止时堆上的每个活动都有1个实例。首先,当我最近在两者之间切换时,这是不可预期的,如果是这样,为什么StrictMode抱怨这个?如果没有预期,我该如何安排避免这种情况?检查堆转储,从主线程堆栈引用这两个对象,我似乎没有任何有用的控制程度。每个都有android.app.ActivityThread$ActivityClientRecord的引用,我似乎也无法控制。

所以,基本上,任何想法我如何避免这种情况?这实际上是代表活动泄漏,还是StrictMode过于敏感?

1 个答案:

答案 0 :(得分:2)

我知道这是老帖子。仅适用于那些正在寻找解决方案并解释此问题的人。

如果存在InstanceCountViolation异常,则表示存在Activity泄漏的实际问题。否则可能存在与Android SDK中如何实现detectActivityLeaks检查有关的问题。

要确定这是否有问题,我可以推荐以下帖子:Detecting leaked Activities in Android。如果您发现存在与此活动有关的对象与Android Framework无关,那么您有一个问题需要由您修复。

如果没有任何对象持有对此活动的引用与Android Framework无关,则意味着您遇到与如何实现detectActivityLeaks检查相关的问题。在这种情况下,为了解决活动失败的问题而不关闭detectActivityLeaks,您可以在调试配置中启动活动之前运行 System.gc(),如下例所示:

 if (BuildConfig.DEBUG)
 {         
     System.gc();
 }

 Intent intent = new Intent(context, SomeActivity.class);
 this.startActivity(intent);

answer中提供了更多信息。