Страница 1 из 1

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

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

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

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

Добавлено: 21 авг 2012, 11:13
AndreyI
А что мешает передавать контекст приложения в конструкторах классов?

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

Добавлено: 21 авг 2012, 11:17
Mikhail_dev
Немало классов, что без контекста. Во все передавать контекст... Ну как-то некрасиво. Как вариант конечно. Что-то он не очень нравится. Но всё равно спасибо.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 25 авг 2012, 11:13
AndreyI
Одно дело, если сервис вылетает при ошибке, другое, когда он убивается при нехватке памяти, вот тут то и интересно как ведет себя система.