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?
是的,你会出现内存泄漏。您应该使用应用程序上下文。查看关于 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)
| 归档时间: |
|
| 查看次数: |
1105 次 |
| 最近记录: |