-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 36
|
|
1 | |
Глобальные переменные, методы - где лучше заводить?10.06.2016, 13:02. Показов 3019. Ответов 20
Метки нет (Все метки)
Добрый день!
Только начинаю осваивать Android разработку. Бывает так, что для удобства требуется завести глобальные переменные, доступными из любой Activity приложения, любого класса приложения. Также бывает нужно какие-то общие функции описать, доступные также отовсюду в пределах приложения, возможно общие диалоги. Как это лучше всего организовать? Есть мысль создать отдельный, некий GlobalActivity extends AppCompatActivity со всеми общими методами, а все свои Activity унаследовать от GlobalActivity. Правильно ли так делать, как вы считаете? Если да, то в какой момент и где лучше делать инициализацию глоб.переменных? Поделитесь опытом. Спасибо.
0
|
10.06.2016, 13:02 | |
Ответы с готовыми решениями:
20
Где лучше заводить пользователей? Где обьявлять глобальные переменные Где описываются глобальные переменные? Где описывать глобальные переменные, классы и структуры? |
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
|
|
10.06.2016, 14:00 | 2 |
AlexV1, привет!
Обычно создают BaseActivity, от которой наследуют другие Activity. Там прописывают какие-то методы для onResume, onPause, иногда onCreate (установка Receiver, например). В вашем случае можно порекомендовать один из трёх вариантов. 1) Всё сохранять в SharedPreferences, это удобно, например, для хранения данных между запусками приложения. 2) Делать класс со статическими методами и полями. 3) Делать Singleton.
0
|
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 36
|
|
12.06.2016, 17:32 [ТС] | 4 |
> 1) Всё сохранять в SharedPreferences, это удобно, например, для хранения данных между запусками приложения.
SharedPreferences я так понимаю это для хранения настроек, а мне нужно для переменных и констант, которые не нужно сохранять от запуска к запуску. Поэтому думаю SharedPreferences не лучшее решение для временных глобальных переменных. > 2) Делать класс со статическими методами и полями. > вариант 2 самый ненадежный Но почему, можете объяснить? Я так и думал поступить, в чем же ненадежность? > 3) Делать Singleton. Про это пока не читал, но поизучаю что это.
0
|
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
|
|
12.06.2016, 19:48 | 5 |
AlexV1, вам посоветовали вариант с наследником Application. Он хорошо подходит для временных глобальных переменных.
Там же можно вызвать и создание Singleton, если хочется.
0
|
114 / 120 / 26
Регистрация: 29.01.2014
Сообщений: 609
|
|
13.06.2016, 06:14 | 6 |
если вам нужно сохранить постоянные переменые, например адрес сервера, лучший варриант это класс со статическими переменными, но пользоваться им действительно нужно аккуратно, не изменять их.
0
|
129 / 126 / 22
Регистрация: 23.06.2009
Сообщений: 700
|
|
14.06.2016, 12:08 | 7 |
0
|
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
|
|
14.06.2016, 12:44 | 8 |
petruchodd
1 стартует активити, поля инициализируются 2 поля меняются из этой или другой активити 3 система прибивает активити и пересоздает ее - поля заново инициализированы и не хранят тех изменений которые были произведены над ними
0
|
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 36
|
|
14.06.2016, 13:23 [ТС] | 9 |
Простите, а статические элементы разве относятся к объектам (не к классу) и могут быть уничтожены при пересоздании Activity?
0
|
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
|
|
14.06.2016, 13:27 | 11 |
AlexV1, там все очень непросто. как я понял статика может пересоздаваться не потому что объект погиб (статика живет без объектов вы совершенно правы) а потому что лоадер системы перезагрузил весь класс.
Добавлено через 53 секунды Паблито, если приложение выгрузит целиком то статика наследника приложения так же погибнет но в этом случае никакого пересоздания не будет так как умерло именно приложение или я не прав?
1
|
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 36
|
|
14.06.2016, 13:37 [ТС] | 12 |
0
|
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
|
|
14.06.2016, 13:37 | 13 |
я хотел сказать примерно тоже самое, но выразилсся криво
пару раз просто напоролся на это сворачиваешь программу, через время разворачиваешь и получи NPE на каком-нибудь static String поле в утилитарном классе
1
|
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
|
|
14.06.2016, 13:41 | 14 |
AlexV1, как показал Паблито сценарий может выглядеть так:
1 вы сворачиваете программу 2 системе не хватает ресурсов и она убивает объект и даже класс активити вашей программы стоящей на паузе (само приложение не убивается... пока...) 3 вы разворачиваете программу - система загружает класс вашей активити и создает объект --- если нехватака ресурсов будет критической система убьет и приложение но в этом случае вы не сможете к нему вернуться - оно будет по честному убито. я так понял
0
|
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 36
|
|
14.06.2016, 13:44 [ТС] | 15 |
Спасибо за подробности.
Буду знать, чтобы не наткнуться на эти грабли :-)
0
|
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
|
|
14.06.2016, 13:52 | 16 |
AlexV1, они не часто вылазают. построил приложение на такой статике и оно благополучно живет в плей маркете. ну иногда AVR сыпятся в консоль разработчика, ну бывает)
Добавлено через 1 минуту за 6 месяцев 13 вылетов предполжительно из-за этого а может еще из за чего
0
|
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 36
|
|
14.06.2016, 14:00 [ТС] | 17 |
0
|
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
|
|
14.06.2016, 14:27 | 18 |
AlexV1, глоб переменные лучше (исключительно на мой взгляд) хранить в статике наследника приложения. в SharedPreferences хранить то что обычные приложения для ПК хранят в файлах конфигурации например. то есть настройки которые должны сохранятся при выходе из программы
0
|
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 36
|
|
14.06.2016, 15:48 [ТС] | 19 |
vxg, Хорошо. Если я правильно понял, вы предлагаете создать MyApplication extends Application и в нем создать static переменные.
А проинициализировать, например, в OnCreate главной Activity или где лучше?
0
|
4 / 4 / 0
Регистрация: 12.04.2016
Сообщений: 39
|
|
14.06.2016, 16:10 | 20 |
вопрос дополнительно задам. а почему вот это не годится для хранения данных?
0
|
14.06.2016, 16:10 | |
14.06.2016, 16:10 | |
Помогаю со студенческими работами здесь
20
Как и где объявлять глобальные переменные типа String? Где объявить глобальные переменные и массив? И как это сделать? Глобальные и локальные переменные: что лучше (или что для чего и в чем конкретная разница)? Где лучше эти переменные объявлять? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |