Я пытаюсь получить доступ к ресурсам приложений (специфичные для строковых ресурсов) из класса Singleton. Будучи Singleton, этот класс не может ссылаться на объекты Context (чтобы предотвратить утечку памяти). Хотя я искал другие реализации в сети, я столкнулся с этими двумя реализациями:Использование контекста без какой-либо статической ссылки
- Создайте статический контекст в классе Application и используйте его в приложении.
- Пропустить контекст как параметр метода, который его требует.
Я не хочу использовать кулак, так как он также использует статическую ссылку на объект Контекста. Я понимаю, что это нормально, что он статически включен в класс Application android, но все же выглядит как хак.
Вторая реализация бесполезна, так как у меня нет экземпляра контекста, который я могу передать в someOtherMethod из singleton.
Итак, я придумал следующую реализацию, в которой я делаю свой реферат Singleton, чтобы переопределить его контекст, требующий методов (например, getString(int resId)
в коде ниже), когда я инициализирую экземпляр singleton.
Мне любопытно узнать, может ли это привести к утечке памяти сейчас?
Где я путать с этим подходом:
-> Ссылка на контекст, в перекрытом 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/и т. Д. Обеспечивал бы контекст, делая ваш singleton несколько ненужным. – chessdork
Я работаю над игрой для Android и использую сервисы Google Play Game. Я думал о синглете, поскольку мне нужно, чтобы один GoogleApiClient поддерживал приложение. –