代码可能过于复杂而无法在此完整发布,但这里是基本模式:我有两个Activity
子类,每个子类都有一个ListView
。每个ListView
都有一个自定义类的适配器,它还生成自定义类的View
个实例。这些列表显示了在另一个线程中异步生成的数据项;因为它需要知道将更新发送到何处,所以它操作的数据对象具有WeakReference<>
个对象,这些对象被设置为在初始化时保持对显示其内容的适配器的引用。当选择第一个活动列表中的对象时,我启动第二个活动,其意图指示它查找项目并显示其内容。然后我使用“后退”按钮关闭第二个活动并返回第一个活动。出于某种原因,当我在启用StrictMode
检查的情况下运行它时,它会在两次活动之间切换几次后总是崩溃,抱怨我的Activity
类之一的实例太多了。
我已安排在崩溃之前写入堆转储(请参阅Android StrictMode and heap dumps)。这些堆转储始终显示在终止时堆上的每个活动都有1个实例。首先,当我最近在两者之间切换时,这是不可预期的,如果是这样,为什么StrictMode
抱怨这个?如果没有预期,我该如何安排避免这种情况?检查堆转储,从主线程堆栈引用这两个对象,我似乎没有任何有用的控制程度。每个都有android.app.ActivityThread$ActivityClientRecord
的引用,我似乎也无法控制。
所以,基本上,任何想法我如何避免这种情况?这实际上是代表活动泄漏,还是StrictMode过于敏感?
答案 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中提供了更多信息。