|
Где держать глобальные методы?
|
|||
---|---|---|---|
#18+
Добрый день. Вопрос в том, где можно хранить глобальные методы UI потока? Суть в том, что нужна независимость от стартовой активности, которая может умирать и возрождаться множество раз в течении жизни приложения. Приложение работает с сетью. Сеть живет в отдельном потоке. И от сетевого потока периодически будет приходить информация о своем состоянии в пользовательский интерфейс и заранее не известно в какую активность или в какой фрагмент попадет. Предполагается, что заинтересованные фрагменты или активности будут реализовывать интерфейс слушателя интересующего события типа onNetworkConnected, onNetworkDisconnected, onDataReceivedFromServer и т.д. Так вот нужен единый диспетчер, генерирующий эти события для подписанных слушателей. Этот диспетчер будет единственным получателем готовой информации от фоновых процессов, хранителем данных и единственным распределителем по пользовательскому интерфейсу. И диспетчер должен жить постоянно на протяжении всей жизни приложения. Возможно ли вообще такое? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 09:49 |
|
Где держать глобальные методы?
|
|||
---|---|---|---|
#18+
Я тоже с этим сталкивался и моё впечатление (хоть писал и средствами Xamarin), что без singleton под Android никак, хоть я и не любитель его использовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 09:55 |
|
Где держать глобальные методы?
|
|||
---|---|---|---|
#18+
vlad333Возможно ли вообще такое? Как вариант перекрыть application. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 10:03 |
|
Где держать глобальные методы?
|
|||
---|---|---|---|
#18+
Про синглет читал тут http://developer.android.com/intl/ru/reference/android/app/Application.html : developer.android.comThere is normally no need to subclass Application. In most situation, static singletons can provide the same functionality in a more modular way. If your singleton needs a global context (for example to register broadcast receivers), the function to retrieve it can be given a Context which internally uses Context.getApplicationContext() when first constructing the singleton. Контекст как раз мне и нужен для получения широковещательных рассылок. И вот далее про Контекст , есть пугающая фраза про невозможность разрегистрировать подписку на рассылки , что приведет к утечкам: quote developer.android.comIf used from the Context returned here, the receiver is being registered with the global state associated with your application. Thus it will never be unregistered for you. This is necessary if the receiver is associated with static data, not a particular component. However using the ApplicationContext elsewhere can easily lead to serious leaks if you forget to unregister, unbind, etc. А здесь видимо кто-то уже столкнулся с похожими проблемами на уровне Application. Если у кого-нибудь есть подобный опыт, прокомментируйте пожалуйста. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 10:13 |
|
Где держать глобальные методы?
|
|||
---|---|---|---|
#18+
vlad333Приложение работает с сетью. Сеть живет в отдельном потоке. Может с сетью стоит работать из сервиса? А принимаемые данные при необходимости отдавать через бинды. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 10:15 |
|
Где держать глобальные методы?
|
|||
---|---|---|---|
#18+
Ну, во-первых я не рекомендую listener'ами делать сами Activity (см. рекомендацию сообщением выше). Для хранения данных из сети (если их много) есть много вариантов (хоть по той ж ссылке предложен один из них). Во-вторых, в сами Activity тяжеловесные данные, полагаю, стоит загружать по onResume и удалять по onPause, ну и прочие варианты в зависимости от особенностей данных, но не держать в памяти слишком много. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 10:37 |
|
Где держать глобальные методы?
|
|||
---|---|---|---|
#18+
Ilya81, Если я правильно понял, то получается следующая схема: В стартовой активности создается Singleton.getInstance(Context context), который в свою очередь получает глобальный контекст приложения Context.getApplicationContext() и будет хранить все необходимые данные и методы. Стартовая активность может запускать другие активности и фрагменты и спокойно умирать если так решит ОС, а наш Singleton будет спокойно жить своей жизнью являясь получателем рассылок, Handler-ов, и т.д. данных других потоков и сервисов и предоставляя свои данные для других получателей. Фрагменты и активности сами ничего хранить не будут, а только получать ссылки на объекты внутри Singleton, который живет внутри потока UI и поэтому способен без ошибок взаимодействовать с пользовательским интерфейсом. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 11:06 |
|
Где держать глобальные методы?
|
|||
---|---|---|---|
#18+
vlad333Стартовая активность может запускать другие активности и фрагменты и спокойно умирать если так решит ОС, а наш Singleton будет спокойно жить своей жизнью Нет. Не будет жить или не будет жить спокойно. См. 16746837 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 11:10 |
|
Где держать глобальные методы?
|
|||
---|---|---|---|
#18+
wadmanНет. Не будет жить или не будет жить спокойно. Почему не будет? Видимых причин для этого нет. Я протестировал: В одной активности первый раз вызвал Singleton.getInstance(), контекст приложения взялся нормально, изменил в нем несколько полей. Вышел из активности. В другой активности все записанные данные прочитались. Ничего не грохнулось. Единственно проблема, в том, что при выходе из приложения приложение не убивается и Singleton остается жить дальше и в следующий запуск продолжает радовать данными из предыдущего запуска, но это тем или иным способом можно решить принудительно очистив его при выходе из главной активности. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 13:37 |
|
Где держать глобальные методы?
|
|||
---|---|---|---|
#18+
vlad333Единственно проблема, в том, что при выходе из приложения приложение не убивается и Singleton остается жить дальше и в следующий запуск продолжает радовать данными из предыдущего запуска, но это тем или иным способом можно решить принудительно очистив его при выходе из главной активности. Зачем делать то, что не рекомендуется: заставлять пользователя все время держать приложение активным, чтоб не пропустить нечто важное? Слово "сервис" пугает? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 13:42 |
|
Где держать глобальные методы?
|
|||
---|---|---|---|
#18+
Это приложение не сервисное, а скорее визуально-мониторинговое. В фоне оно ничего нужного и полезного не делает. Поэтому оно всегда будет открытым пока это нужно пользователю. Данные поступают через сеть почти каждую секунду и пользователь на них сразу реагирует и решает важные они для него или нет. Нотификации из фонового сервиса при каком-то редком событии тут не нужны ввиду отсутствия интересных редких событий(если такая надобность появится, то реализовать такое проблем не составит, это должно хорошо вписаться в вышеизложенную архитектуру). Вид приложения разделен на несколько фрагментов одновременно отображающихся. В каждом из них в реальном времени отображается своя информация. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 14:05 |
|
Где держать глобальные методы?
|
|||
---|---|---|---|
#18+
wadman, Ilya81 Спасибо за идеи. Уже получается то, что нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 14:24 |
|
Где держать глобальные методы?
|
|||
---|---|---|---|
#18+
vlad333Спасибо за идеи. Уже получается то, что нужно. Раз решил все таки идти немного задом, то почитай и про WeakReference и тогда контекст всегда будет актуальным. Проверил, что WR вернул, если null, то лезем к аппликэйшн за новым контекстом иначе WR.get(). ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 14:39 |
|
Где держать глобальные методы?
|
|||
---|---|---|---|
#18+
wadman, Имеется ввиду контекст приложения? Я в конструкторе Singleton получаю контекст самого приложения через контекст вызывающей активности. this.apcontext=context.getApplicationContext(); Контекст самого приложения не должен протухнуть во время его жизни, и соответственно поля этого Одиночки. докаReturn the context of the single, global Application object of the current process. This generally should only be used if you need a Context whose lifecycle is separate from the current context, that is tied to the lifetime of the process rather than the current component. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 15:25 |
|
Где держать глобальные методы?
|
|||
---|---|---|---|
#18+
vlad333Имеется ввиду контекст приложения? Имеется в виду так полюбившееся пользователями убивание приложения всякими таск менеджерами. Шлепнут твое приложение, контекст умрет, а при следующем запуске дальвик (не знаю, как арт будет делать) достанет твое приложение из кэша. При таком сценарии я не уверен, что будет все стабильно. Так что все таки сделай через weakreference, это поможет обойти подобные сценарии. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 15:49 |
|
Где держать глобальные методы?
|
|||
---|---|---|---|
#18+
Как можно воспроизвести подобные сценарии, чтобы проверить? Я пробовал убивать процесс, когда он на экране и когда из приложения вышли. Всегда в этих случаях получается новый объект Singleton.getInstance(Context context) и в нем соответственно получается новый контекст. Если прибить процесс, когда открыта вторая активность(из стартовой), то андроид сам перезапускает приложение и идет в стартовую активность как с нуля. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 16:33 |
|
Где держать глобальные методы?
|
|||
---|---|---|---|
#18+
архитектурно подойти по другому. 1. выбросить всю работу с сетью на сторону сервиса. у него жизненный цикл всяко будет дольше, ну и фореграунд никто не отменял. 2. сервис пусть и уведомляет активности, как решать вам. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 18:48 |
|
Где держать глобальные методы?
|
|||
---|---|---|---|
#18+
как вариан, можно имя текущей активити сохранять в базе, и при восстановлении читать базу и открывать нужную а вообще в сервис -наиболее правильное решение. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2014, 20:18 |
|
Где держать глобальные методы?
|
|||
---|---|---|---|
#18+
А в чем преимущества сервиса перед отдельными потоками в данном конкретном случае? Сервис необходим в случае, когда работа должна продолжаться когда приложение закрыто, например, почтовый клиент в фоне проверяет почту или какой-нибудь IM-чат сообщения ловит. Или сервис должен работать на несколько других приложений. Здесь же никакой фоновой работы при закрытом приложении не должно быть, и при выходе из программы вся активность в т.ч. сетевая должна быть ликвидирована. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2014, 08:19 |
|
Где держать глобальные методы?
|
|||
---|---|---|---|
#18+
vlad333Как можно воспроизвести подобные сценарии, чтобы проверить? У меня нет четкого сценария, я лишь однажды с таким столкнулся и пару дней пытался воспроизвести. Решил, что рисковать не стоит и перешел на weakreference. vlad333Здесь же никакой фоновой работы при закрытом приложении не должно быть, и при выходе из программы вся активность в т.ч. сетевая должна быть ликвидирована. Если так, то скорее всего сервис действительно избыточен. Но я-бы все равно им воспользовался. Запустить и остановить не проблема, работает отдельно от активностей. Хоть какая-то разделенность. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2014, 09:22 |
|
Где держать глобальные методы?
|
|||
---|---|---|---|
#18+
почему сразу сервисы значит фоновое выполнение. меня например раздражает, когда смотришь код, а там всю сетевую логику запихали в активити, и такой лапшекод получается. вынеси логически в другую сторону. сейчас у меня либо РЕСТ либо сервисы , и никаких потоков и прочей ерунды на стороне вьюшек, они вообще ничего такого не знают. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2014, 12:20 |
|
Где держать глобальные методы?
|
|||
---|---|---|---|
#18+
Дак в активностях и не будет никакого кода, чисто контроллер, который будет заниматься своим прямым делом - контролировать вьюшки. А вся логика будет жить в отдельном диспетчере - singleton классе, на который будут через интерфейсы подписаны активности с фрагментами чтобы получать данные для отображения. А как там в диспетчере ведется работа - с сервисами или с потоками или эльфы материализуют данные, визуальная часть абсолютно не знает. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2014, 13:35 |
|
Где держать глобальные методы?
|
|||
---|---|---|---|
#18+
просто не понимаю, зачем нужен синглентон класс... я тоже раньше что то с нимим мудрил, но теперь в принципе архитектурно подхожу по другому. к тому же, есть контент провайдеры и БД. что тоже отчасти упрощает работу. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2014, 16:54 |
|
|
start [/forum/topic.php?fid=13&msg=38784962&tid=1331545]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
31ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 264ms |
total: | 400ms |
0 / 0 |