【问题标题】:Android strict mode detects multiple activity instance violation, but I have no idea whyAndroid严格模式检测到多个活动实例违规,但我不知道为什么
【发布时间】:2013-02-28 09:02:42
【问题描述】:

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

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

那么,基本上,有什么想法可以避免这种情况吗?这是否真的代表活动泄漏,还是 StrictMode 只是过于敏感?

【问题讨论】:

  • 可能相关,但遗憾的是缺乏有用的答案,这个问题似乎描述了一个非常相似的问题:stackoverflow.com/questions/6602129/…
  • 你找到这个问题的答案了吗?我们面临着类似的问题。
  • 不,我在这个问题上并没有比我写这个问题时更先进。我只是不再使用严格模式的这个功能;测试似乎过于敏感,无法提供任何有用的信息。
  • 你如何“不使用”严格模式?
  • 我在我的应用程序用来设置严格模式的 StrictMode.VmPolicy.Builder 上删除了对“detectActivityLeaks()”的调用。

标签: android memory-leaks android-strictmode


【解决方案1】:

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

如果出现 InstanceCountViolation 异常,则意味着存在 Activity 泄漏的真正问题。否则可能会出现与在 Android SDK 中如何实现 detectActivityLeaks 检查有关的问题。

要确定这是否是一个问题,我可以推荐以下帖子:Detecting leaked Activities in Android。如果您会看到一些对象持有对此活动的引用,而这些引用与 Android 框架无关,那么您有一个问题应该由您解决。

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

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

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

更多信息请参见answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多