|
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 36
|
|
Глобальные переменные, методы - где лучше заводить?10.06.2016, 13:02. Показов 3497. Ответов 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 | |
|
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
|
|
|
129 / 126 / 22
Регистрация: 23.06.2009
Сообщений: 700
|
|
| 14.06.2016, 12:08 | |
|
0
|
|
|
Модератор
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
|
|
|
Модератор
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 [ТС] | ||
0
|
||
|
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
|
||
| 14.06.2016, 13:37 | ||
|
пару раз просто напоролся на это сворачиваешь программу, через время разворачиваешь и получи NPE на каком-нибудь static String поле в утилитарном классе
1
|
||
|
Модератор
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
|
|
|
Модератор
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 [ТС] | ||
0
|
||
|
Модератор
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
|
|
| 14.06.2016, 16:10 | |
|
Помогаю со студенческими работами здесь
20
Где описывать глобальные переменные, классы и структуры? Как и где объявлять глобальные переменные типа String?
Глобальные и локальные переменные: что лучше (или что для чего и в чем конкретная разница)? Где лучше эти переменные объявлять? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Философия технологии
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 - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|