Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 36
1

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

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

Author24 — интернет-сервис помощи студентам
Добрый день!

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

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

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

Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.06.2016, 13:02
Ответы с готовыми решениями:

Где лучше заводить пользователей?
В таблице Users в базе данных, либо создавать учетки на серве MS SQL? Как вы делаете?)

Где обьявлять глобальные переменные
Доброго времени суток. Где обьявлять глобальные переменные? Я сделал так: namespace...

Где описываются глобальные переменные?
Подскажите,где в Lazarus описываются глобальные переменные

Где описывать глобальные переменные, классы и структуры?
народ подскажите пожалуста где в VS глобальные переменные описывать, классы и структуры? а то...

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
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
10.06.2016, 14:36 3
лучше 1 или 3
вариант 2 самый ненадежный
или делать своего наследника от Application, по обстоятельствам
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
Цитата Сообщение от Паблито Посмотреть сообщение
вариант 2 самый ненадежный
+1 тоже очень интересно , в чем может быть беда.
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
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
14.06.2016, 13:25 10
приложение вообще может быть выгружено из памяти в любой момент
а потом из бандла восстановится и вопрос - чему будут равны статические переменные?
1
Модератор
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
vxg
, интересно, а зачем лоадер перезапускает мою программу в любой момент? И исчезает ли она при этом с экрана или же просто временно уничтожает класс и визуально не происходит ничего, но статические переменные обнуляются?
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
14.06.2016, 13:37 13
Цитата Сообщение от vxg Посмотреть сообщение
потому что лоадер системы перезагрузил весь класс.
я хотел сказать примерно тоже самое, но выразилсся криво

пару раз просто напоролся на это
сворачиваешь программу, через время разворачиваешь и получи 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
3 вы разворачиваете программу - система загружает класс вашей активити и создает объект
значит глоб.переменные лучше все же не в статике хранить, а в SharedPreferences, а загружать их оттуда в onCreate активити. Вот только какой из активити?
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.06.2016, 16:10
Помогаю со студенческими работами здесь

Как и где объявлять глобальные переменные типа String?
Извините за нубовский вопрос, но никак не могу разобраться где и как объявлять глобальные...

Где объявить глобальные переменные и массив? И как это сделать?
Работаю с формами, очень нужны глобальные переменные, но я кажется тупая, и тулю их не туда или не...

Глобальные и локальные переменные: что лучше (или что для чего и в чем конкретная разница)?
Что лучше (или как надо (или что для чего и в чем конкретная разница)): 1. // объявление в...

Где лучше эти переменные объявлять?
Посмотрите пожалуйста на следующий код (код сишный, но компилировался как C++, так как в чистом Си...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru