gpt4 book ai didi

java - 将上下文从 Activity 传递到静态类是否会永远保留该 Activity?内存泄漏?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:43:40 26 4
gpt4 key购买 nike

我正在尝试设计一个 GCMHelper 类。从本质上讲,该类是一个单例,Activity 可以请求单例以这样的方式设置 GCM()。

GCMHelper.getInstance(MainActivity.this).setupGCM();

setupGCM() 方法将只查看是否需要 GCM 注册(例如,应用程序没有 gcm,或者应用程序更新需要新的 gcm),如果不需要注册则什么也不做。

这是“好的”,因为我的 Activity 不需要触及 GCM id 值。一切都在单例的 setupGCM() 方法中处理。 setupGCM() 在后台发生,因此控制会立即返回 Activity 。没有用户界面滞后。 GCM id 生成速度很快,但我试图解释文档中的以下错误。

public static final String ERROR_SERVICE_NOT_AVAILABLE

The device can't read the response, or there was a 500/503 from the server that can be retried later. The application should use exponential back off and retry.

所以我的 setupGCM 方法将继续尝试(准确地说是 5 次,每次重试之间的每次延迟之间增加几秒)。但是如果用户按下并在所述 Activity 上调用 finish() 会发生什么。现在 Activity 结束了,但是上下文仍然是用单例保存的。这会导致内存泄漏吗?

即使 GCMHelper 不是单例,也会发生这种情况。它是单例的原因是,下次创建 Activity 时,它可以查看是否已经在进行重新生成重试。

如果我将 MainActivity.this.getApplicationContext() 传递给单例所需的上下文,会发生什么情况。这对 Activity 会更好吗,因为它可以被 GC 处理?

最佳答案

是的,你会发生内存泄漏。您应该使用应用程序上下文。查看这篇有关 Context 的好文章 http://possiblemobile.com/2013/06/context/

Quote : 如果这个 Context 是一个 Activity,我们将有效地在内存中劫持所有 View 和其他与之关联的潜在大对象;造成泄漏。

它甚至为您的案例提供了一个使用单例的示例:

public class CustomManager {
private static CustomManager sInstance;

public static CustomManager getInstance(Context context) {
if (sInstance == null) {
//Always pass in the Application Context
sInstance = new CustomManager(context.getApplicationContext());
}

return sInstance;
}

private Context mContext;

private CustomManager(Context context) {
mContext = context;
}
}

关于java - 将上下文从 Activity 传递到静态类是否会永远保留该 Activity?内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27988811/

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