将一个上下文从一个Activity传递给一个静态类是否永远保存该Activity?内存泄漏?

EGH*_*HDK 6 java android memory-leaks android-activity google-cloud-messaging

我正在尝试设计一个GCMHelper类.本质上,该类是单例,并且Activity可以请求单例设置为setupGCM().

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

setupGCM()方法只会查看是否需要GCM注册(例如,app没有gcm,或者app更新需要新的gcm),如果不需要注册则不执行任何操作.

这是"ok",因为我的活动不需要触及GCM id值.一切都在singleton的setupGCM()方法中处理.setupGCM()在后台发生,因此控制权可以直接恢复到活动状态.没有UI延迟.GCM ID生成发生得很快,但我正在尝试解释文档中的以下错误.

public static final String ERROR_SERVICE_NOT_AVAILABLE

设备无法读取响应,或者服务器中有500/503可以在以后重试.应用程序应使用指数退避并重试.

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

即使GCMHelper不是单身人士,也会发生这种情况.它是单例的原因是,下次创建活动时,它可以查看重新生成重试是否已在进行中.

如果我将MainActivity.this.getApplicationContext()传递给单例所需的上下文会发生什么.对于Activity来说会更好吗,因为它会被允许进行GC?

Gre*_*s36 0

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

引用 :If this Context were an Activity, we would effectively hold hostage in memory all the views and other potentially large objects associated with it; creating a leak.

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)