【发布时间】:2016-12-31 21:57:39
【问题描述】:
我正在尝试从 Singleton 类访问应用程序资源(具体为字符串资源)。作为 Singleton,此类不能保存对 Context 对象的任何引用(以防止内存泄漏)。当我在网上寻找其他实现时,我遇到了这两个实现:
- 在 Application 类中创建一个静态上下文并在整个应用程序中使用它。
- 将上下文作为参数传递给需要它的方法。
我不想使用第一个,因为它还使用对 Context 对象的静态引用。我知道在android的Application类中静态拥有它是可以的,但它仍然看起来像一个hack。
第二个实现是无用的,因为我没有任何可以传递给单例的 someOtherMethod 的上下文实例。
所以我想出了以下实现,当我初始化单例实例时,我使我的单例抽象覆盖其上下文需要方法(例如,下面代码中的getString(int resId))。
我很想知道这是否会导致任何内存泄漏?
我在哪里对这种方法感到困惑:
--> Overridden getString 中对上下文的引用是最终的。我不确定这是否会导致内存泄漏。
public abstract class SingletonClass{
.
.
.
private static SingletonClass sInstance;
private SingletonClass(Context paramContext) {
// constructor code
}
public static SingletonClass getInstance(final Context context) {
if (sInstance == null) {
sInstance = new SingletonClass(context){
@Override
public String getString(int resId) {
return context.getString(resId);
}
};
}
return sInstance;
}
public abstract String getString(int resId);
.
.
.
private void someOtherMethod(){
//uses above getString()
}
}
【问题讨论】:
-
您能否分享一下您是如何使用这些字符串的,更具体地说,为什么您在使用它们时没有
Context?在大多数情况下,Activity / Service / BroadcastReceiver / SQLiteOpenHelper / etc. 会提供上下文,使你的单例有点不必要。 -
我正在开发一款安卓游戏并在其中使用 Google Play 游戏服务。我想到了单例,因为我需要在整个应用程序中保留一个 GoogleApiClient。
标签: android design-patterns memory-leaks singleton