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

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

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

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

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

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

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

Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.06.2016, 13:02
Ответы с готовыми решениями:

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

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

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

20
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
10.06.2016, 14:00
AlexV1, привет!
Обычно создают BaseActivity, от которой наследуют другие Activity. Там прописывают какие-то методы для onResume, onPause, иногда onCreate (установка Receiver, например).
В вашем случае можно порекомендовать один из трёх вариантов.
1) Всё сохранять в SharedPreferences, это удобно, например, для хранения данных между запусками приложения.
2) Делать класс со статическими методами и полями.
3) Делать Singleton.
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
10.06.2016, 14:36
лучше 1 или 3
вариант 2 самый ненадежный
или делать своего наследника от Application, по обстоятельствам
0
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 36
12.06.2016, 17:32  [ТС]
> 1) Всё сохранять в SharedPreferences, это удобно, например, для хранения данных между запусками приложения.
SharedPreferences я так понимаю это для хранения настроек, а мне нужно для переменных и констант, которые не нужно сохранять от запуска к запуску. Поэтому думаю SharedPreferences не лучшее решение для временных глобальных переменных.

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

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

> 3) Делать Singleton.
Про это пока не читал, но поизучаю что это.
0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
12.06.2016, 19:48
AlexV1, вам посоветовали вариант с наследником Application. Он хорошо подходит для временных глобальных переменных.
Там же можно вызвать и создание Singleton, если хочется.
0
114 / 120 / 26
Регистрация: 29.01.2014
Сообщений: 609
13.06.2016, 06:14
если вам нужно сохранить постоянные переменые, например адрес сервера, лучший варриант это класс со статическими переменными, но пользоваться им действительно нужно аккуратно, не изменять их.
0
 Аватар для petruchodd
129 / 126 / 22
Регистрация: 23.06.2009
Сообщений: 700
14.06.2016, 12:08
Цитата Сообщение от Паблито Посмотреть сообщение
вариант 2 самый ненадежный
+1 тоже очень интересно , в чем может быть беда.
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
14.06.2016, 12:44
petruchodd
1 стартует активити, поля инициализируются
2 поля меняются из этой или другой активити
3 система прибивает активити и пересоздает ее - поля заново инициализированы и не хранят тех изменений которые были произведены над ними
0
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 36
14.06.2016, 13:23  [ТС]
Простите, а статические элементы разве относятся к объектам (не к классу) и могут быть уничтожены при пересоздании Activity?
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
14.06.2016, 13:25
приложение вообще может быть выгружено из памяти в любой момент
а потом из бандла восстановится и вопрос - чему будут равны статические переменные?
1
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
14.06.2016, 13:27
AlexV1, там все очень непросто. как я понял статика может пересоздаваться не потому что объект погиб (статика живет без объектов вы совершенно правы) а потому что лоадер системы перезагрузил весь класс.

Добавлено через 53 секунды
Паблито, если приложение выгрузит целиком то статика наследника приложения так же погибнет но в этом случае никакого пересоздания не будет так как умерло именно приложение или я не прав?
1
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 36
14.06.2016, 13:37  [ТС]
vxg
, интересно, а зачем лоадер перезапускает мою программу в любой момент? И исчезает ли она при этом с экрана или же просто временно уничтожает класс и визуально не происходит ничего, но статические переменные обнуляются?
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
14.06.2016, 13:37
Цитата Сообщение от vxg Посмотреть сообщение
потому что лоадер системы перезагрузил весь класс.
я хотел сказать примерно тоже самое, но выразилсся криво

пару раз просто напоролся на это
сворачиваешь программу, через время разворачиваешь и получи NPE на каком-нибудь static String поле в утилитарном классе
1
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
14.06.2016, 13:41
AlexV1, как показал Паблито сценарий может выглядеть так:
1 вы сворачиваете программу
2 системе не хватает ресурсов и она убивает объект и даже класс активити вашей программы стоящей на паузе (само приложение не убивается... пока...)
3 вы разворачиваете программу - система загружает класс вашей активити и создает объект
---
если нехватака ресурсов будет критической система убьет и приложение но в этом случае вы не сможете к нему вернуться - оно будет по честному убито. я так понял
0
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 36
14.06.2016, 13:44  [ТС]
Спасибо за подробности.
Буду знать, чтобы не наткнуться на эти грабли :-)
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
14.06.2016, 13:52
AlexV1, они не часто вылазают. построил приложение на такой статике и оно благополучно живет в плей маркете. ну иногда AVR сыпятся в консоль разработчика, ну бывает)

Добавлено через 1 минуту
за 6 месяцев 13 вылетов предполжительно из-за этого а может еще из за чего
0
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 36
14.06.2016, 14:00  [ТС]
3 вы разворачиваете программу - система загружает класс вашей активити и создает объект
значит глоб.переменные лучше все же не в статике хранить, а в SharedPreferences, а загружать их оттуда в onCreate активити. Вот только какой из активити?
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
14.06.2016, 14:27
AlexV1, глоб переменные лучше (исключительно на мой взгляд) хранить в статике наследника приложения. в SharedPreferences хранить то что обычные приложения для ПК хранят в файлах конфигурации например. то есть настройки которые должны сохранятся при выходе из программы
0
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 36
14.06.2016, 15:48  [ТС]
vxg, Хорошо. Если я правильно понял, вы предлагаете создать MyApplication extends Application и в нем создать static переменные.
А проинициализировать, например, в OnCreate главной Activity или где лучше?
0
4 / 4 / 0
Регистрация: 12.04.2016
Сообщений: 39
14.06.2016, 16:10
вопрос дополнительно задам. а почему вот это не годится для хранения данных?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.06.2016, 16:10
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru