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

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

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

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

最佳答案 我知道这是老帖子.只是为那些正在寻找解决方案和解决这个问题的人.

如果存在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.

点赞