【问题标题】:Will static Stack<Activity> cause memory-leak?static Stack<Activity> 会导致内存泄漏吗?
【发布时间】:2017-11-10 07:13:55
【问题描述】:

我创建一个对象来管理活动。像这样:

public class ActivityManager {
    private static ActivityManager instance;
    private static Stack<Activity> activityStack;

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

我在 BaseActivity 中使用它:

public class BaseActivity extends AppCompatActivity {
    protected String TAG = "BaseActivity";
    protected ActivityManager mActivityManger;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mActivityManger = ActivityManager.getInstance();
        mActivityManger.addActivity(this);

    }
}

在这个例子中,静态对象持有活动的引用。

这是内存泄漏吗?

为什么在leakcanary中什么也没发生?

如果collection中的add-function会持有activity的引用?

【问题讨论】:

    标签: java android memory-leaks


    【解决方案1】:

    尝试故意泄露一些东西,例如将您的启动器活动实例分配给静态字段。

    或者尝试反击,我相信这会在 Activity 被销毁后触发泄漏(并且会出现一个 toast),并且 LeakCanary 会检测它是否泄漏。

    或尝试参考here 获取另一个样本

    【讨论】:

    • 我知道引用会导致内存泄漏。但在这个例子中,什么都没有发生。如果是收藏专用?
    • 我之前没有尝试过并且不在文档中,但这可能是 [this Repo][github.com/square/leakcanary/blob/master/README.md],我猜的另一个功能。
    • 我已经用过leakcanary。如果collection中的add-function会持有activity的引用,我感到很疑惑。
    • 如果您真的想检查 Activity 的实例,请尝试换行和调试,以便您可以轻松地分析您在此处添加的 Activity 列表。
    猜你喜欢
    • 2021-03-23
    • 2021-09-25
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2011-06-16
    • 2011-10-28
    相关资源
    最近更新 更多