2015-12-21 6 views
0

У меня проблема с моим классом singleton, который используется службами. Одиночный сигнал вызывается двумя службами для уведомления. Singleton учитывает 2 переменные для двух служб.Android singleton над несколькими службами

Проблема заключается в том:

Один счетчик увеличивается только первые услуги и второй переменной другими службами, хотя это синглтон, который держит 2 переменные. Я не понимаю, почему две службы имеют разные экземпляры синглтона.

public static synchronized NotificationSingleton getInstance() { 

    if (mInstance == null) { 
     mInstance = new NotificationSingleton(); 
    } 
    return mInstance; 
} 

Это должно возвращать единственный экземпляр синглтона.

+0

Как вы обращаетесь к своему синглотону? –

+0

Просто с getInstance(). Я сделал печать, чтобы показать, создан ли новый экземпляр, но есть только один созданный. – soMasu

+1

Выполняются ли ваши службы в одном процессе (то есть: ваш манифест определяет 'android: process' для ваших услуг)? Имеет ли ваш singleton какие-либо нестатические вложенные классы, которые вы создаете в другом месте вашего кода? Кроме того, как вы обнаружили/подтвердили, что существует более одного экземпляра вашего синглтона? –

ответ

1

Ваша реализация singleton не является потокобезопасной. Это может быть проблемой. Вы должны попробовать с initialization on-demand holder:

public class NotificationSingleton { 

    private static final class Holder { 
     private static final NotificationSingleton INSTANCE = new NotificationSingleton(); 
    } 

    public static NotificationSingleton getInstance() { 
     return Holder.INSTANCE; 
    } 

    private NotificationSingleton() {} 

} 
+0

Пожалуйста, подтвердите свое утверждение, почему исходный фрагмент не является потокобезопасным. Конечно, он не самый эффективный (поскольку он мог бы выиграть от двойной проверки блокировки), но iirc, ленивый подход к инициализации только склонен к тонким ошибкам на pre-Java 1.5. В эти дни это больше не должно быть проблемой. –

0

Ну я напишу ответ на вопрос сам:

Решения добавить такой же андроид: процесс = «имя» для всех услуг в манифесте. Все они должны работать в одном процессе.

Смежные вопросы