【发布时间】: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