gpt4 book ai didi

java - Android - 这是内存泄漏吗? (在一个Activity中创建的对象作为静态变量在另一个Activity中引用)

转载 作者:行者123 更新时间:2023-12-01 09:37:19 27 4
gpt4 key购买 nike

假设我有 Activity1,它创建了一个简单的自定义对象 CustObject。CustObject 不引用任何 Context 或类似类型的对象。然后,我想通过在 Activity2 中将其设置为静态变量来将此实例传递给 Activity2。看一下对应的代码:

public class CustObject {

private int attr;

public CustObject(int arg) { // takes only integers and Strings
attr = arg;
}
}

这是第一个 Activity :

public class Activity1 extends Activity {

private CustObject co;

@Override
protected void onCreate(Bundle b) {
co = new CustObject(42);
}

public void launchActivity2() {
Activity2.co = co;
startActivity(new Intent(this, Activity2.class);
}
}

这是第二个 Activity :

public class Activity2 extends Activity {

public static CustObject co;

@Override
protected void onCreate(Bundle b) {
// stuff
}

// Do operations on the co object.
}

所以我的想法是,当我们启动 Activity2 时,我们只“泄漏”co 对象 - 这是想要的 - 但 Activity1 的其余部分及其上下文可以在必要时进行垃圾收集,而不会出现任何问题/泄漏,对吗?

请注意,我想这样做,因为 CustObject co 可能会被 Activity2 更改,并且如果 Activity1 尚未被终止,我希望这些更改自动显示在 Activity1 中。如果它已被杀死,那么它会起作用,因为所有内容都将重新加载,并且 Activity2 中对 CustObject 的更改也存储在数据库中。

感谢您的帮助!

PS:另外,我一直想知道通过提供“this”作为 Intent 上下文来启动 Activity 是否会泄漏父 Activity?

最佳答案

所以...

  1. 静态变量位于 perm-gen 区域。用简单的英语来说——它们都保存在堆中的指定区域中。更多信息请参见:static allocation in java - heap, stack and permanent generation

  2. 因此,无论 Activity1Activity2 的状态如何,您的 Activity2.co 对象都不会被垃圾回收。这并不完全是“泄漏”,但一旦设置 - 对象将在进程生命周期内占用内存。

  3. Android 可能随时“终止”Activity 以释放内存。 Activity 应该通过 savedState 对象维护其状态。更多信息请参见:https://developer.android.com/training/basics/activity-lifecycle/recreating.html

  4. 因此,存储静态对象可能不是在 Activity 之间传递数据的正确方法。以下是对替代方案的讨论:How do I pass data between Activities in Android application?

关于java - Android - 这是内存泄漏吗? (在一个Activity中创建的对象作为静态变量在另一个Activity中引用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38767727/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com