static class != singleton. Как сделать чтобы было = ?

Ответить
Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

static class != singleton. Как сделать чтобы было = ?

Сообщение Mikhail_dev » 21 авг 2012, 10:54

Добрый день. Есть одна проблема. Есть активности, которые создаются в одном процессе. Есть сервис, порожденный в другом процессе. Всё это находится в одном приложении. Есть статический класс Logger, который я вызываю в обоих процессах. В КАЖДОМ процессе экземпляр класса логгер создается свой, что производит различные трудности в работе программы, т.к. логгер использует кеширование. И кеш получается у каждого свой.

Как сделать так, чтобы этот класс был реально синглтоном? Экстендить от android.app.Application можно, но у меня некоторые классы не расширяются от контекста, в следствие чего я не могу получить ссылку на синглтон application. Что посоветуете?

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: static class != singleton. Как сделать чтобы было = ?

Сообщение AndreyI » 21 авг 2012, 11:13

А что мешает передавать контекст приложения в конструкторах классов?

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: static class != singleton. Как сделать чтобы было = ?

Сообщение Mikhail_dev » 21 авг 2012, 11:17

Немало классов, что без контекста. Во все передавать контекст... Ну как-то некрасиво. Как вариант конечно. Что-то он не очень нравится. Но всё равно спасибо.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: static class != singleton. Как сделать чтобы было = ?

Сообщение Mikhail_dev » 23 авг 2012, 12:32

Ответ. Никак. 2 процесса - две виртуальные машины - для каждой своё порождение класса. Синглтон превращается в этом случае в дуалтон.
Вот здравый диалог на эту тему http://4pda.ru/forum/index.php?showtopic=370994

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: static class != singleton. Как сделать чтобы было = ?

Сообщение AndreyI » 23 авг 2012, 14:25

Правильно пишут. Если разносить сервис и активности по разным процессам, то действительно так и будет.
По умолчанию Activity и сервисы запускаются в процессе приложения (хоть и в разных потоках), если вы для них явно не укажите в манифесте иное -
android:multiprocess="true"

Они ж вам советуют все в одном процессе реализовать, тогда задача с сиглтоном Application вполне решаема.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: static class != singleton. Как сделать чтобы было = ?

Сообщение Mikhail_dev » 24 авг 2012, 19:32

Там немного по другому в манифесте указывается строка для того, чтобы сервис был в отдельном процессе. На счет что сервис в отдельном потоке по умолчанию... Разве по умолчанию сервис ен запустится в НЕ отдельном потоке, а в потоке откуда он был вызван?
Да и понял что решается задача, но логика приложения строится так,что сервис отдельно сможет подниматься от приложения если что не так, а также и с помощью Активности, которая в другом процессе. Т.е. помирать они будут по раздельности. А если в одном потоке, то у меня закрадываются большие сомнения, что андроид не выгрузит именно весь поток целиком.

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: static class != singleton. Как сделать чтобы было = ?

Сообщение AndreyI » 24 авг 2012, 22:22

На счет что сервис в отдельном потоке по умолчанию... Разве по умолчанию сервис ен запустится в НЕ отдельном потоке, а в потоке откуда он был вызван?
Я не совсем корректно выразился, имелось ввиду "хотя и могут быть в разных потоках", точнее выполнять код в отдельных потоках.
По умолчанию все запускается в одном процессе приложения и одном потоке. Насчет того, что он будет в том же потоке откуда он вызван сомневаюсь, скорее всего он всегда будет запускаться в UI потоке, ведь сервис в конечном счете запускается системой (не зависимо от того из какого потока он был вызван).
По поводу борьбы за живучесть сервисов, может действительно опасения напрасны? Если уж системе будет так сурово не хватать памяти, то что ей стоит убить оба процесса, может решить эту задачу просто уведомлением пользователя в onStop, что сервис остановлен и его требуется перезапустить (что можно также сделать одним касанием по уведомлению). К тому же, если системе будет так жарко, неужели она так просто даст перезапустить убитый процесс заново? Естественно она тоже начнет бороться за живучесть и снова его убьет, что получится в итоге такой борьбы, как это будет выглядеть и кто победит неизвестно.
Можно попробовать как-то это протестировать, создайте два сервиса в отдельных процессах, чтобы каждый контролировал состояние другого и перезапускал его в случае, если процесс был убит. Затем как-то симулируйте нехватку памяти - запускать что-то "тяжелое" пожирающее память, или если есть рутованый зверь, то можно попробовать уменьшить лимиты памяти. Интересно к чему такое приведет.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: static class != singleton. Как сделать чтобы было = ?

Сообщение Mikhail_dev » 25 авг 2012, 09:20

Насчет того, что он будет в том же потоке откуда он вызван сомневаюсь, скорее всего он всегда будет запускаться в UI потоке, ведь сервис в конечном счете запускается системой (не зависимо от того из какого потока он был вызван).
Нет. Он будет вызван в том потоке, откуда был его вызов. Если мы например сделали поток на что-либо и оттуда стартуем сервис, то он будет в том потоке жить.
К тому же, если системе будет так жарко, неужели она так просто даст перезапустить убитый процесс заново?
Да, еще как даст! Доходило даже до смешного =) У меня крашился сервис из-за ошибки и процесс падал, но так как я сервис запустил через startforeground (повышает его приоритет, вроде так пишется если не ошибаюсь), то он задолбал меня сам стартовать и падать. С минуту он поднимался очень активно, а потом андроид решил, что ошибка внутренняя и перестал его запускать =)
Мы тестируем уже месяца три. Сервис живет отлично от активностей и стартует без неё. Активность у нас как вторичное приложение. Ладно, будем искать материал по поводу выгрузки системой частей программы из-за нехватки памяти. Спасибо за пищу для размышления.

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: static class != singleton. Как сделать чтобы было = ?

Сообщение neoksi » 25 авг 2012, 10:55

no-- писал(а): Да, еще как даст! Доходило даже до смешного =) У меня крашился сервис из-за ошибки и процесс падал, но так как я сервис запустил через startforeground (повышает его приоритет, вроде так пишется если не ошибаюсь), то он задолбал меня сам стартовать и падать. С минуту он поднимался очень активно, а потом андроид решил, что ошибка внутренняя и перестал его запускать =)
Улыбнуло))))

Я пока свой сервис держу при UI потоке, вроде, хотя при крахе активностей, сервис остается жить...

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: static class != singleton. Как сделать чтобы было = ?

Сообщение AndreyI » 25 авг 2012, 11:13

Одно дело, если сервис вылетает при ошибке, другое, когда он убивается при нехватке памяти, вот тут то и интересно как ведет себя система.

Ответить