我正在尝试设计一个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?
答案 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;
}
}