powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / Android [игнор отключен] [закрыт для гостей] / Где держать глобальные методы?
23 сообщений из 23, страница 1 из 1
Где держать глобальные методы?
    #38784937
vlad333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Вопрос в том, где можно хранить глобальные методы UI потока?
Суть в том, что нужна независимость от стартовой активности, которая может
умирать и возрождаться множество раз в течении жизни приложения.
Приложение работает с сетью. Сеть живет в отдельном потоке.
И от сетевого потока периодически будет приходить информация о своем состоянии
в пользовательский интерфейс и заранее не известно в какую активность или в какой
фрагмент попадет.
Предполагается, что заинтересованные фрагменты или активности будут реализовывать
интерфейс слушателя интересующего события типа onNetworkConnected, onNetworkDisconnected,
onDataReceivedFromServer и т.д.
Так вот нужен единый диспетчер, генерирующий эти события для подписанных слушателей.
Этот диспетчер будет единственным получателем готовой информации от фоновых процессов,
хранителем данных и единственным распределителем по пользовательскому интерфейсу.
И диспетчер должен жить постоянно на протяжении всей жизни приложения.


Возможно ли вообще такое?
...
Рейтинг: 0 / 0
Где держать глобальные методы?
    #38784948
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тоже с этим сталкивался и моё впечатление (хоть писал и средствами Xamarin), что без singleton под Android никак, хоть я и не любитель его использовать.
...
Рейтинг: 0 / 0
Где держать глобальные методы?
    #38784962
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad333Возможно ли вообще такое?
Как вариант перекрыть application.
...
Рейтинг: 0 / 0
Где держать глобальные методы?
    #38784976
vlad333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про синглет читал тут 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.

Если у кого-нибудь есть подобный опыт, прокомментируйте пожалуйста.
...
Рейтинг: 0 / 0
Где держать глобальные методы?
    #38784979
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad333Приложение работает с сетью. Сеть живет в отдельном потоке.
Может с сетью стоит работать из сервиса? А принимаемые данные при необходимости отдавать через бинды.
...
Рейтинг: 0 / 0
Где держать глобальные методы?
    #38785012
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, во-первых я не рекомендую listener'ами делать сами Activity (см. рекомендацию сообщением выше). Для хранения данных из сети (если их много) есть много вариантов (хоть по той ж ссылке предложен один из них). Во-вторых, в сами Activity тяжеловесные данные, полагаю, стоит загружать по onResume и удалять по onPause, ну и прочие варианты в зависимости от особенностей данных, но не держать в памяти слишком много.
...
Рейтинг: 0 / 0
Где держать глобальные методы?
    #38785056
vlad333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ilya81,

Если я правильно понял, то получается следующая схема:
В стартовой активности создается Singleton.getInstance(Context context), который в свою очередь получает глобальный контекст приложения Context.getApplicationContext() и будет хранить все необходимые данные и методы.
Стартовая активность может запускать другие активности и фрагменты и спокойно умирать если так решит ОС, а наш Singleton будет спокойно жить своей жизнью являясь получателем рассылок, Handler-ов, и т.д. данных других потоков и сервисов и предоставляя свои данные для других получателей. Фрагменты и активности сами ничего хранить не будут, а только получать ссылки на объекты внутри Singleton, который живет внутри потока UI и поэтому способен без ошибок взаимодействовать с пользовательским интерфейсом.
...
Рейтинг: 0 / 0
Где держать глобальные методы?
    #38785065
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad333Стартовая активность может запускать другие активности и фрагменты и спокойно умирать если так решит ОС, а наш Singleton будет спокойно жить своей жизнью
Нет. Не будет жить или не будет жить спокойно. См. 16746837
...
Рейтинг: 0 / 0
Где держать глобальные методы?
    #38785333
vlad333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadmanНет. Не будет жить или не будет жить спокойно.
Почему не будет?
Видимых причин для этого нет.

Я протестировал: В одной активности первый раз вызвал Singleton.getInstance(), контекст приложения взялся нормально, изменил в нем несколько полей. Вышел из активности. В другой активности все записанные данные прочитались. Ничего не грохнулось.
Единственно проблема, в том, что при выходе из приложения приложение не убивается и Singleton остается жить дальше
и в следующий запуск продолжает радовать данными из предыдущего запуска, но это тем или иным способом можно решить
принудительно очистив его при выходе из главной активности.
...
Рейтинг: 0 / 0
Где держать глобальные методы?
    #38785349
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad333Единственно проблема, в том, что при выходе из приложения приложение не убивается и Singleton остается жить дальше
и в следующий запуск продолжает радовать данными из предыдущего запуска, но это тем или иным способом можно решить
принудительно очистив его при выходе из главной активности.
Зачем делать то, что не рекомендуется: заставлять пользователя все время держать приложение активным, чтоб не пропустить нечто важное? Слово "сервис" пугает?
...
Рейтинг: 0 / 0
Где держать глобальные методы?
    #38785397
vlad333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это приложение не сервисное, а скорее визуально-мониторинговое.
В фоне оно ничего нужного и полезного не делает.
Поэтому оно всегда будет открытым пока это нужно пользователю.
Данные поступают через сеть почти каждую секунду
и пользователь на них сразу реагирует и решает важные они для него или нет.
Нотификации из фонового сервиса при каком-то редком событии тут не нужны
ввиду отсутствия интересных редких событий(если такая надобность появится,
то реализовать такое проблем не составит, это должно хорошо вписаться
в вышеизложенную архитектуру).

Вид приложения разделен на несколько фрагментов одновременно отображающихся.
В каждом из них в реальном времени отображается своя информация.
...
Рейтинг: 0 / 0
Где держать глобальные методы?
    #38785438
vlad333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman, Ilya81
Спасибо за идеи.
Уже получается то, что нужно.
...
Рейтинг: 0 / 0
Где держать глобальные методы?
    #38785489
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad333Спасибо за идеи.
Уже получается то, что нужно.
Раз решил все таки идти немного задом, то почитай и про WeakReference и тогда контекст всегда будет актуальным.

Проверил, что WR вернул, если null, то лезем к аппликэйшн за новым контекстом иначе WR.get().
...
Рейтинг: 0 / 0
Где держать глобальные методы?
    #38785607
vlad333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
...
Рейтинг: 0 / 0
Где держать глобальные методы?
    #38785669
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad333Имеется ввиду контекст приложения?
Имеется в виду так полюбившееся пользователями убивание приложения всякими таск менеджерами. Шлепнут твое приложение, контекст умрет, а при следующем запуске дальвик (не знаю, как арт будет делать) достанет твое приложение из кэша. При таком сценарии я не уверен, что будет все стабильно. Так что все таки сделай через weakreference, это поможет обойти подобные сценарии.
...
Рейтинг: 0 / 0
Где держать глобальные методы?
    #38785775
vlad333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как можно воспроизвести подобные сценарии, чтобы проверить?

Я пробовал убивать процесс, когда он на экране и когда из приложения вышли.
Всегда в этих случаях получается новый объект Singleton.getInstance(Context context)
и в нем соответственно получается новый контекст.
Если прибить процесс, когда открыта вторая активность(из стартовой), то андроид сам перезапускает
приложение и идет в стартовую активность как с нуля.
...
Рейтинг: 0 / 0
Где держать глобальные методы?
    #38785977
Фотография Джибс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
архитектурно подойти по другому.

1. выбросить всю работу с сетью на сторону сервиса.
у него жизненный цикл всяко будет дольше, ну и фореграунд никто не отменял.

2. сервис пусть и уведомляет активности, как решать вам.
...
Рейтинг: 0 / 0
Где держать глобальные методы?
    #38786039
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как вариан, можно имя текущей активити сохранять в базе, и при восстановлении читать базу и открывать нужную
а вообще в сервис -наиболее правильное решение.
...
Рейтинг: 0 / 0
Где держать глобальные методы?
    #38786274
vlad333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А в чем преимущества сервиса перед отдельными потоками в данном конкретном случае?

Сервис необходим в случае, когда работа должна продолжаться когда приложение закрыто,
например, почтовый клиент в фоне проверяет почту или какой-нибудь IM-чат сообщения ловит.
Или сервис должен работать на несколько других приложений.

Здесь же никакой фоновой работы при закрытом приложении не должно быть,
и при выходе из программы вся активность в т.ч. сетевая должна быть ликвидирована.
...
Рейтинг: 0 / 0
Где держать глобальные методы?
    #38786300
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad333Как можно воспроизвести подобные сценарии, чтобы проверить?
У меня нет четкого сценария, я лишь однажды с таким столкнулся и пару дней пытался воспроизвести. Решил, что рисковать не стоит и перешел на weakreference.
vlad333Здесь же никакой фоновой работы при закрытом приложении не должно быть,
и при выходе из программы вся активность в т.ч. сетевая должна быть ликвидирована.
Если так, то скорее всего сервис действительно избыточен. Но я-бы все равно им воспользовался. Запустить и остановить не проблема, работает отдельно от активностей. Хоть какая-то разделенность.
...
Рейтинг: 0 / 0
Где держать глобальные методы?
    #38786516
Фотография Джибс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почему сразу сервисы значит фоновое выполнение.

меня например раздражает, когда смотришь код, а там всю сетевую логику запихали в активити, и такой лапшекод получается.

вынеси логически в другую сторону.


сейчас у меня либо РЕСТ либо сервисы , и никаких потоков и прочей ерунды на стороне вьюшек, они вообще ничего такого не знают.
...
Рейтинг: 0 / 0
Где держать глобальные методы?
    #38786622
vlad333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дак в активностях и не будет никакого кода,
чисто контроллер, который будет заниматься своим прямым делом - контролировать вьюшки.
А вся логика будет жить в отдельном диспетчере - singleton классе, на который будут
через интерфейсы подписаны активности с фрагментами чтобы получать данные для отображения.
А как там в диспетчере ведется работа - с сервисами или с потоками или эльфы материализуют данные,
визуальная часть абсолютно не знает.
...
Рейтинг: 0 / 0
Где держать глобальные методы?
    #38786873
Фотография Джибс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
просто не понимаю, зачем нужен синглентон класс...

я тоже раньше что то с нимим мудрил, но теперь в принципе архитектурно подхожу по другому.

к тому же, есть контент провайдеры и БД.
что тоже отчасти упрощает работу.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Android [игнор отключен] [закрыт для гостей] / Где держать глобальные методы?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]