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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
AlexV1
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 33
#1

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

10.06.2016, 13:02. Просмотров 538. Ответов 20
Метки нет (Все метки)

Добрый день!

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

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

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

Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.06.2016, 13:02     Глобальные переменные, методы - где лучше заводить?
Посмотрите здесь:
Глобальные переменные и их значения Android
Псевдо глобальные переменные Android
Android Глобальные и локальные переменные
Где хранятся static переменные метода в java Android
Где хранить переменные которые используются по всему проекту Android
Где лучше хранить рисунки в приложении? Android
Android Где лучше хранить информацию для приложения?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
10.06.2016, 14:00     Глобальные переменные, методы - где лучше заводить? #2
AlexV1, привет!
Обычно создают BaseActivity, от которой наследуют другие Activity. Там прописывают какие-то методы для onResume, onPause, иногда onCreate (установка Receiver, например).
В вашем случае можно порекомендовать один из трёх вариантов.
1) Всё сохранять в SharedPreferences, это удобно, например, для хранения данных между запусками приложения.
2) Делать класс со статическими методами и полями.
3) Делать Singleton.
Pablito
2419 / 1864 / 583
Регистрация: 12.05.2014
Сообщений: 6,604
Завершенные тесты: 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
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
12.06.2016, 19:48     Глобальные переменные, методы - где лучше заводить? #5
AlexV1, вам посоветовали вариант с наследником Application. Он хорошо подходит для временных глобальных переменных.
Там же можно вызвать и создание Singleton, если хочется.
shavuz
99 / 105 / 19
Регистрация: 29.01.2014
Сообщений: 527
13.06.2016, 06:14     Глобальные переменные, методы - где лучше заводить? #6
если вам нужно сохранить постоянные переменые, например адрес сервера, лучший варриант это класс со статическими переменными, но пользоваться им действительно нужно аккуратно, не изменять их.
petruchodd
90 / 90 / 8
Регистрация: 23.06.2009
Сообщений: 511
14.06.2016, 12:08     Глобальные переменные, методы - где лучше заводить? #7
Цитата Сообщение от Паблито Посмотреть сообщение
вариант 2 самый ненадежный
+1 тоже очень интересно , в чем может быть беда.
vxg
Модератор
3120 / 1922 / 208
Регистрация: 13.01.2012
Сообщений: 7,359
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?
Pablito
2419 / 1864 / 583
Регистрация: 12.05.2014
Сообщений: 6,604
Завершенные тесты: 1
14.06.2016, 13:25     Глобальные переменные, методы - где лучше заводить? #10
приложение вообще может быть выгружено из памяти в любой момент
а потом из бандла восстановится и вопрос - чему будут равны статические переменные?
vxg
Модератор
3120 / 1922 / 208
Регистрация: 13.01.2012
Сообщений: 7,359
14.06.2016, 13:27     Глобальные переменные, методы - где лучше заводить? #11
AlexV1, там все очень непросто. как я понял статика может пересоздаваться не потому что объект погиб (статика живет без объектов вы совершенно правы) а потому что лоадер системы перезагрузил весь класс.

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

пару раз просто напоролся на это
сворачиваешь программу, через время разворачиваешь и получи NPE на каком-нибудь static String поле в утилитарном классе
vxg
Модератор
3120 / 1922 / 208
Регистрация: 13.01.2012
Сообщений: 7,359
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
Модератор
3120 / 1922 / 208
Регистрация: 13.01.2012
Сообщений: 7,359
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
Модератор
3120 / 1922 / 208
Регистрация: 13.01.2012
Сообщений: 7,359
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 Где в проекте Android Studio лучше добавлять элементы в БД SQL?
Где лучше заводить пользователей? SQL Server
Где обьявлять глобальные переменные C#
Где описывать глобальные переменные, классы и структуры? C++/CLI WinForms
Как и где объявлять глобальные переменные типа String? C++/CLI WinForms

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

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

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