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

时间:2015-01-16 16:49:47

标签: java android android-activity memory-leaks google-cloud-messaging

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

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

setupGCM()方法只会查看是否需要进行GCM注册(例如,应用没有gcm,或者应用更新需要新的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?

1 个答案:

答案 0 :(得分:0)

是的,你会有内存泄漏。您应该使用应用程序上下文。 查看关于上下文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;
    }
}