4

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

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

所以,基本上,有什么想法可以避免这种情况吗?这实际上是否代表活动泄漏,或者 StrictMode 只是过于敏感?

4

1 回答 1

2

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

如果出现 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);

此答案中提供了更多信息。

于 2014-08-14T15:13:38.910 回答