Ранее я использовала Singleton наподобие этого:
public class Singleton {
private static Singleton instance;
private Singleton (){
}
public static Singleton getInstance(){
if (null == instance){
instance = new Singleton();
}
return instance;
}
}
Ранее я видела много примеров использования такого класса в андроид-приложениях и различных справочниках. Но наткнулась на статью, в которой был описан недостаток использования такого Singleton в Android:
Мы создаем экземпляр класса Singleton в контексте текущей Activity и
если эта Activity завершает свою работу, то и экземпляр класса будет
уничтожен (причем не сразу, а когда сработает сборщик мусора Java). А
значит при следующем вызове getInstance() объект будет создаваться
заново (вновь вызовется конструктор). Если в классе Singleton мы
храним какие-то статичные переменные или методы, то это можно просто
проигнорировать.
Вот ссылка на статью
Далее в этой статье говорится, что, чтобы избежать такой ошибки, нужно инициализировать синглтон в подклассе класса Application:
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
Log.w("MY", "onCreate MyApp");
MySingleton.initInstance();
}
}
И сам синглтон:
class MySingleton {
...
public static void initInstance() {
Log.d("MY", "MySingleton::InitInstance()");
if (mInstance == null) {
mInstance = new MySingleton();
}
}
public static MySingleton getInstance() {
Log.d("MY", "MySingleton::getInstance()");
return mInstance;
}
...
}
теперь вне зависимости от того какие activities работают экземпляр класса
MySingleton будет существовать.
То есть, это более правильный вариант использования Singleton в Android? Нет ли у этого способа каких-либо недостатков? Хотелось бы узнать вашу точку зрения.
Ответ
В случае использования паттерна Singleton при разработке для Android важно помнить две вещи:
Никогда не сохранять в синглтоне ссылку на активити. Если для работы синглтона нужен контекст, используйте контекст приложения. Иначе будут утечки памяти.
Всегда лучше создать приватную переменную в потомке класса Application со ссылкой на экземпляр вместо приватной статической в самом классе сиглтона, если это возможно.
Следуя этим двум простым правилам будет сложнее "выстрелить себе в ногу" :)
Комментариев нет:
Отправить комментарий