Форум программистов, компьютерный форум CyberForum.ru

Глобальные переменные, методы - где лучше заводить? - Android

Войти
Регистрация
Восстановить пароль
 
 
AlexV1
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 33
10.06.2016, 13:02     Глобальные переменные, методы - где лучше заводить? #1
Добрый день!

Только начинаю осваивать Android разработку.
Бывает так, что для удобства требуется завести глобальные переменные, доступными из любой Activity приложения, любого класса приложения.
Также бывает нужно какие-то общие функции описать, доступные также отовсюду в пределах приложения, возможно общие диалоги.

Как это лучше всего организовать?

Есть мысль создать отдельный, некий GlobalActivity extends AppCompatActivity со всеми общими методами, а все свои Activity унаследовать от GlobalActivity.
Правильно ли так делать, как вы считаете?
Если да, то в какой момент и где лучше делать инициализацию глоб.переменных?
Поделитесь опытом.

Спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
10.06.2016, 14:00     Глобальные переменные, методы - где лучше заводить? #2
AlexV1, привет!
Обычно создают BaseActivity, от которой наследуют другие Activity. Там прописывают какие-то методы для onResume, onPause, иногда onCreate (установка Receiver, например).
В вашем случае можно порекомендовать один из трёх вариантов.
1) Всё сохранять в SharedPreferences, это удобно, например, для хранения данных между запусками приложения.
2) Делать класс со статическими методами и полями.
3) Делать Singleton.
Паблито
резкий
1890 / 1624 / 503
Регистрация: 12.05.2014
Сообщений: 5,849
Завершенные тесты: 1
10.06.2016, 14:36     Глобальные переменные, методы - где лучше заводить? #3
лучше 1 или 3
вариант 2 самый ненадежный
или делать своего наследника от Application, по обстоятельствам
AlexV1
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 33
12.06.2016, 17:32  [ТС]     Глобальные переменные, методы - где лучше заводить? #4
> 1) Всё сохранять в SharedPreferences, это удобно, например, для хранения данных между запусками приложения.
SharedPreferences я так понимаю это для хранения настроек, а мне нужно для переменных и констант, которые не нужно сохранять от запуска к запуску. Поэтому думаю SharedPreferences не лучшее решение для временных глобальных переменных.

> 2) Делать класс со статическими методами и полями.
> вариант 2 самый ненадежный

Но почему, можете объяснить?
Я так и думал поступить, в чем же ненадежность?

> 3) Делать Singleton.
Про это пока не читал, но поизучаю что это.
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
12.06.2016, 19:48     Глобальные переменные, методы - где лучше заводить? #5
AlexV1, вам посоветовали вариант с наследником Application. Он хорошо подходит для временных глобальных переменных.
Там же можно вызвать и создание Singleton, если хочется.
shavuz
69 / 75 / 12
Регистрация: 29.01.2014
Сообщений: 347
13.06.2016, 06:14     Глобальные переменные, методы - где лучше заводить? #6
если вам нужно сохранить постоянные переменые, например адрес сервера, лучший варриант это класс со статическими переменными, но пользоваться им действительно нужно аккуратно, не изменять их.
petruchodd
 Аватар для petruchodd
89 / 89 / 8
Регистрация: 23.06.2009
Сообщений: 505
14.06.2016, 12:08     Глобальные переменные, методы - где лучше заводить? #7
Цитата Сообщение от Паблито Посмотреть сообщение
вариант 2 самый ненадежный
+1 тоже очень интересно , в чем может быть беда.
vxg
Модератор
 Аватар для vxg
2737 / 1748 / 174
Регистрация: 13.01.2012
Сообщений: 6,539
14.06.2016, 12:44     Глобальные переменные, методы - где лучше заводить? #8
petruchodd
1 стартует активити, поля инициализируются
2 поля меняются из этой или другой активити
3 система прибивает активити и пересоздает ее - поля заново инициализированы и не хранят тех изменений которые были произведены над ними
AlexV1
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 33
14.06.2016, 13:23  [ТС]     Глобальные переменные, методы - где лучше заводить? #9
Простите, а статические элементы разве относятся к объектам (не к классу) и могут быть уничтожены при пересоздании Activity?
Паблито
резкий
1890 / 1624 / 503
Регистрация: 12.05.2014
Сообщений: 5,849
Завершенные тесты: 1
14.06.2016, 13:25     Глобальные переменные, методы - где лучше заводить? #10
приложение вообще может быть выгружено из памяти в любой момент
а потом из бандла восстановится и вопрос - чему будут равны статические переменные?
vxg
Модератор
 Аватар для vxg
2737 / 1748 / 174
Регистрация: 13.01.2012
Сообщений: 6,539
14.06.2016, 13:27     Глобальные переменные, методы - где лучше заводить? #11
AlexV1, там все очень непросто. как я понял статика может пересоздаваться не потому что объект погиб (статика живет без объектов вы совершенно правы) а потому что лоадер системы перезагрузил весь класс.

Добавлено через 53 секунды
Паблито, если приложение выгрузит целиком то статика наследника приложения так же погибнет но в этом случае никакого пересоздания не будет так как умерло именно приложение или я не прав?
AlexV1
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 33
14.06.2016, 13:37  [ТС]     Глобальные переменные, методы - где лучше заводить? #12
vxg
, интересно, а зачем лоадер перезапускает мою программу в любой момент? И исчезает ли она при этом с экрана или же просто временно уничтожает класс и визуально не происходит ничего, но статические переменные обнуляются?
Паблито
резкий
1890 / 1624 / 503
Регистрация: 12.05.2014
Сообщений: 5,849
Завершенные тесты: 1
14.06.2016, 13:37     Глобальные переменные, методы - где лучше заводить? #13
Цитата Сообщение от vxg Посмотреть сообщение
потому что лоадер системы перезагрузил весь класс.
я хотел сказать примерно тоже самое, но выразилсся криво

пару раз просто напоролся на это
сворачиваешь программу, через время разворачиваешь и получи NPE на каком-нибудь static String поле в утилитарном классе
vxg
Модератор
 Аватар для vxg
2737 / 1748 / 174
Регистрация: 13.01.2012
Сообщений: 6,539
14.06.2016, 13:41     Глобальные переменные, методы - где лучше заводить? #14
AlexV1, как показал Паблито сценарий может выглядеть так:
1 вы сворачиваете программу
2 системе не хватает ресурсов и она убивает объект и даже класс активити вашей программы стоящей на паузе (само приложение не убивается... пока...)
3 вы разворачиваете программу - система загружает класс вашей активити и создает объект
---
если нехватака ресурсов будет критической система убьет и приложение но в этом случае вы не сможете к нему вернуться - оно будет по честному убито. я так понял
AlexV1
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 33
14.06.2016, 13:44  [ТС]     Глобальные переменные, методы - где лучше заводить? #15
Спасибо за подробности.
Буду знать, чтобы не наткнуться на эти грабли :-)
vxg
Модератор
 Аватар для vxg
2737 / 1748 / 174
Регистрация: 13.01.2012
Сообщений: 6,539
14.06.2016, 13:52     Глобальные переменные, методы - где лучше заводить? #16
AlexV1, они не часто вылазают. построил приложение на такой статике и оно благополучно живет в плей маркете. ну иногда AVR сыпятся в консоль разработчика, ну бывает)

Добавлено через 1 минуту
за 6 месяцев 13 вылетов предполжительно из-за этого а может еще из за чего
AlexV1
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 33
14.06.2016, 14:00  [ТС]     Глобальные переменные, методы - где лучше заводить? #17
3 вы разворачиваете программу - система загружает класс вашей активити и создает объект
значит глоб.переменные лучше все же не в статике хранить, а в SharedPreferences, а загружать их оттуда в onCreate активити. Вот только какой из активити?
vxg
Модератор
 Аватар для vxg
2737 / 1748 / 174
Регистрация: 13.01.2012
Сообщений: 6,539
14.06.2016, 14:27     Глобальные переменные, методы - где лучше заводить? #18
AlexV1, глоб переменные лучше (исключительно на мой взгляд) хранить в статике наследника приложения. в SharedPreferences хранить то что обычные приложения для ПК хранят в файлах конфигурации например. то есть настройки которые должны сохранятся при выходе из программы
AlexV1
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 33
14.06.2016, 15:48  [ТС]     Глобальные переменные, методы - где лучше заводить? #19
vxg, Хорошо. Если я правильно понял, вы предлагаете создать MyApplication extends Application и в нем создать static переменные.
А проинициализировать, например, в OnCreate главной Activity или где лучше?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2016, 16:10     Глобальные переменные, методы - где лучше заводить?
Еще ссылки по теме:

Android Переменные класса Application
Android AndEngine. Не находятся методы
Где лучше хранить рисунки в приложении? Android
Android Где в проекте Android Studio лучше добавлять элементы в БД SQL?
Android Глобальные и локальные переменные

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
dimon4
4 / 4 / 0
Регистрация: 12.04.2016
Сообщений: 39
14.06.2016, 16:10     Глобальные переменные, методы - где лучше заводить? #20
вопрос дополнительно задам. а почему вот это не годится для хранения данных?
Yandex
Объявления
14.06.2016, 16:10     Глобальные переменные, методы - где лучше заводить?
Ответ Создать тему
Опции темы

Текущее время: 22:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru