2

要清除所有后台活动,我执行了以下操作:

我保留了一个静态数组列表,每当我从一个活动转到另一个活动时,在新活动的 onCreate() 方法中,我将当前活动的对象添加到该列表中,如下所示:

SomeClass.addActivity(CurrentActivity.this);

我在每个活动中添加了上述语句。

添加活动():

public void addActivity(final Activity activity) {
            activityList.add(activity);
        }

当我想清除堆栈时,我调用了:

public boolean clearStack() {
        for (Activity activity : activityList) {
            activity.finish();
        }
        activityList.clear();
        return (activityList.isEmpty());
    }

这样,我清除了我的活动堆栈。

但它产生了内存泄漏。这不是正确的做法。持有对活动的引用是不行的。你们能解释一下在这种情况下为什么以及如何发生内存泄漏吗?

我使用 MAT for eclipse 在我的应用程序中找到了这个内存泄漏。

任何帮助将不胜感激。

4

2 回答 2

2

持有对其上下文之外的活动的引用(当它们在后台或“关闭”/完成时)会导致内存泄漏 - Android 操作系统希望在决定是时候从内存中清除“旧”活动(您无法手动控制)。

在那种情况下 - 垃圾收集器会尝试从内存中释放活动/活动,但是因为某些东西(你对活动的引用数组)持有对它的引用 - 它不能被垃圾收集,所以它不能释放它来自内存 - 这是内存泄漏的一个示例。

本文档描述了如何避免内存泄漏:

http://android-developers.blogspot.co.uk/2009/01/avoiding-memory-leaks.html

于 2012-06-01T06:38:21.340 回答
0

尝试旋转设备几次,看看会发生什么——你最终会耗尽内存,因为你仍然持有对 GC 无法清除的先前上下文的引用。

于 2012-06-01T06:45:29.627 回答